我目前正在尝试新编译的绑定,并且已经达到(再次)我错过了一个难题的一个点:为什么我必须打电话Bindings.Update?到现在为止,我认为实施 INotifyPropertyChanged已经足够了?
在我的例子中,如果我调用这个神秘的方法(由编译的绑定自动生成),GUI只显示正确的值.
我正在使用具有以下(此处简化的)xaml语法的用户控件:
<UserControl>
<TextBlock Text="x:Bind TextValue"/>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
where TextValue是此用户控件的简单依赖项属性.在页面中,我将此控件用作:
<Page>
<SampleControl TextValue="{x:Bind ViewModel.Instance.Name}"/>
</Page>
Run Code Online (Sandbox Code Playgroud)
哪里:
ViewModel是一个在InitializeComponent()运行之前设置的标准属性Instance 是一个简单的实现对象 INotifyPropertyChanged加载后Instance,我提出了一个属性更改事件Instance.我甚至可以调试到TextValue用户控件的depency属性获取正确值的行 - 但是没有显示任何内容.只有在我打电话时Bindings.Update(),才会显示该值.我在这里错过了什么?
更新
我也没办法{x:Bind ... Mode=OneWay}.
更多代码
Person.cs:
using System.ComponentModel;
using System.Threading.Tasks;
namespace App1 {
public class Person : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged;
private string name;
public string Name { get {
return this.name;
}
set …Run Code Online (Sandbox Code Playgroud) 我正在尝试构建一个自定义比较器,它允许将比较函数分配给内部字段.为了简化比较器的创建,我尝试添加一个类似构造函数的类函数Construct来初始化比较器.
现在,如果我尝试编译以下示例,则显示编译器
[dcc32 Fehler] ConsoleDemo1.dpr(37):E2555无法跟踪符号'结果'
我有以下示例代码:
program ConsoleDemo1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
Generics.Collections, Generics.Defaults,
System.SysUtils;
type
TConstFunc<T1, T2, TResult> = reference to function(const Arg1: T1; const Arg2: T2): TResult;
TDemo = class(TComparer<string>)
private
FVar: TConstFunc<string, string, Integer>;
function CompareInternal(const L, R: string): Integer;
public
class function Construct(): TDemo;
function Compare(const L, R: string): Integer; override;
end;
function TDemo.Compare(const L, R: string): Integer;
begin
Result := FVar(L, R);
end;
function TDemo.CompareInternal(const L, R: string): Integer;
begin
Result := …Run Code Online (Sandbox Code Playgroud) 我不时地使用监视窗口来显示包含sql语句的字符串.
现在我从上下文菜单中选择Copy Value并获取
'SELECT NAME FROM SAMPLE_TABLE WHERE FIRST_NAME = ''George'''#$D#$A
Run Code Online (Sandbox Code Playgroud)
当然,如果我想在显示结果的sql工具中执行它,则必须重新格式化此语句.这有点烦人.
有没有诀窍/解决方法?
在示例项目中,我通过代码analzyer获得以下通知消息:
我试图禁用上述规则(CA1033) - 但该消息仍然存在.由于没有创建此异常的文件的信息,我不知道哪个文件导致异常.
我尝试的另一件事是将第二个visual studio实例作为调试器附加,但是当触发异常时它不会中断.
有任何想法吗?我应该将这个问题报告给分析器github项目吗?
NullReferenceException的Stacktrace:
"Microsoft.AnalyzerPowerPack.CSharp.Design.CSharpInterfaceMethodsShouldBeCallableByChildTypesAnalyzer" löste eine Ausnahme des Typs "System.NullReferenceException" mit der Meldung "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." aus.
Prjm.BackEnd 1 Analyzer "Microsoft.AnalyzerPowerPack.CSharp.Design.CSharpInterfaceMethodsShouldBeCallableByChildTypesAnalyzer" hat die folgende Ausnahme ausgelöst:
"System.NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
bei Microsoft.AnalyzerPowerPack.CSharp.Design.CSharpInterfaceMethodsShouldBeCallableByChildTypesAnalyzer.ShouldExcludeCodeBlock(SyntaxNode codeBlock)
bei Microsoft.AnalyzerPowerPack.Design.InterfaceMethodsShouldBeCallableByChildTypesAnalyzer`1.AnalyzeCodeBlock(CodeBlockAnalysisContext context)
bei Microsoft.CodeAnalysis.Diagnostics.AnalyzerExecutor.<>c__DisplayClass38_0.<ExecuteCodeBlockActions>b__0()
bei Microsoft.CodeAnalysis.Diagnostics.AnalyzerExecutor.ExecuteAndCatchIfThrows_NoLock(DiagnosticAnalyzer analyzer, Action analyze)".
Run Code Online (Sandbox Code Playgroud) (问题小标题:资源不支持.netstandard 1.3或者我的项目文件是否搞砸了?)
我刚刚在Visual Studio 2015 Update 3中创建了一个示例可移植类库,并添加了一个示例资源文件.最初,该文件project.json如下所示:
{
"supports": {
"net46.app": {},
"uwp.10.0.app": {},
"dnxcore50.app": {}
},
"dependencies": {
"Microsoft.NETCore": "5.0.0",
"Microsoft.NETCore.Portable.Compatibility": "1.0.0"
},
"frameworks": {
"dotnet": {
"imports": "portable-net452+win81"
}
}
}
Run Code Online (Sandbox Code Playgroud)
好的:没有编译错误!
之后,我使用项目属性进行定位.NETStandard 1.3.
现在project.json看起来像这样:
{
"supports": {},
"dependencies": {
"Microsoft.NETCore.Portable.Compatibility": "1.0.1",
"NETStandard.Library": "1.6.0"
},
"frameworks": {
"netstandard1.3": {}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我得到以下构建错误 - 这意味着基本上EmbeddedRessource不支持构建操作:
我真的不是专家project.json,但对我来说,事情看起来不一致 - 我不知道问题出在哪里.
project.json:如果我支持net46,为什么要导入net452?project.json ….NET 4.6我可以通过以下方式检测当前代码页:
System.Text.Encoding.Default
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试将一个正在从标准类库中读取文件的类库移植到一个可移植的类库,支持ASP.NET Core 5.使用这种配置Encoding.Default是不可用的.
当然,任何最近的文件都应该保存在UTF-8编码中,但是我无法确保所有文件都以这种编码方式存储.
有没有其他方法来获取默认代码页?
我查看了参考源,发现Encoding.DefaultWin32 Api调用实现了(更少)
如果我{x:Bind {RelativeSource Self}}在数据模板中使用,编译时会出现以下错误:
你调用的对象是空的.
我们的想法是将模板化对象传递给属性,如命令参数.以下是MainPage.xaml的示例:
<Page
x:Class="XBindTest5.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XBindTest5"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<ResourceDictionary>
<local:OpenItemCommand x:Key="OpenCommand"/>
</ResourceDictionary>
</Page.Resources>
<StackPanel Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ItemsControl ItemsSource="{x:Bind NewsItems, Mode=OneWay}">
<ItemsControl.ItemTemplate>
<DataTemplate x:DataType="local:NewsItem">
<StackPanel>
<Button Command="{x:Bind {StaticResource OpenCommand}}" CommandParameter="{x:Bind {RelativeSource Self}}">
<TextBlock Text="{x:Bind Title}"/>
</Button>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Page>
Run Code Online (Sandbox Code Playgroud)
代码-behinde文件MainPage.xaml.cs中定义了一个简单的模型:
using System;
using System.Collections.ObjectModel;
using System.Windows.Input;
using Windows.UI.Xaml.Controls;
namespace XBindTest5 {
public class NewsItem {
public string Title { get; set; }
}
/// <summary>
/// …Run Code Online (Sandbox Code Playgroud) 有System.SysUtils.TShortIntHelper(和其他人)我可以写:
output := 5.ToString();
Run Code Online (Sandbox Code Playgroud)
将数字格式化5为string.同样,有System.SysUtls.TExtendedHelper,但我无法编译:
output := (5.0).ToString();
Run Code Online (Sandbox Code Playgroud)
E2018:需要记录,对象或类类型
其他不起作用的版本:
5.0.ToString()(1.0+5.1).toString()(5+0.).toString() (说E2029:')'预期但'''找到了)实际工作的版本:
(1+5.1).toString()(1.1+1+5.1).toString()5.9e0.toString()如果声明了扩展值const,它也不起作用:
function TestFormat(): String;
const
q = 5.5;
begin
Result := q.ToString();
end;
Run Code Online (Sandbox Code Playgroud)
但它的定义是q : extended = 5.5;有效的.所以,我想知道为什么编译器会以这种方式运行.
文档说:
TFMTBCDField 封装了二进制编码十进制 (BCD) 字段常见的基本行为。BCD 值比浮点数提供更高的精度和准确度。BCD 字段通常用于存储和操作货币值。
不幸的是,我发现将这样的字段与Extended值结合使用,我会失去精度(在本例中为两位数):如果我使用
BcdField.AsExtended := Value;
Run Code Online (Sandbox Code Playgroud)
该值实际上被截断为四位数字。对此我能做什么?
完整示例:
procedure TForm1.Button1Click(Sender: TObject);
var
LValue: Double;
LDataset: TClientDataSet;
LFieldDef: TFieldDef;
begin
LValue := 1 / 3;
LDataset := TClientDataSet.Create(self);
try
LFieldDef := LDataset.FieldDefs.AddFieldDef;
LFieldDef.DataType := ftFMTBcd;
LFieldDef.Size := 6;
LFieldDef.Precision := 10;
LFieldDef.Name := 'A';
LDataset.CreateDataset;
LDataset.Append;
LDataset.FieldByName('A').AsExtended := LValue;
LDataset.Post;
ShowMessage(FloatToStr(LDataset.FieldByName('A').AsExtended));
ShowMessage(FloatToStr(LValue));
finally
FreeAndNil(LDataset);
end;
end;
Run Code Online (Sandbox Code Playgroud)
输出(在消息框中):
0,3333
0,333333333333333
Run Code Online (Sandbox Code Playgroud) 以下代码无法使用C# 7.0/ Visual Studio 2017.2进行编译:
class C {
private static readonly int s = 5;
public static ref int Data => ref s;
}
Run Code Online (Sandbox Code Playgroud)
是否存在禁止静态只读字段引用的技术原因,或者这只是一个缺失的功能?
错误消息说:
CS8162:静态只读字段不能通过引用返回.
c# ×6
delphi ×4
winrt-xaml ×2
bcd ×1
c#-7.0 ×1
csproj ×1
debugging ×1
delphi-xe3 ×1
encoding ×1
precision ×1
project.json ×1
ref ×1
return ×1
uwp ×1