我试图从我编写的自定义控件中的dependency property
设置绑定,但我注意到绑定未正确更新。我应该注意,我只是从属性绑定。
该物业非常标准,如下所示:
public bool HasText
{
get => (bool)GetValue(HasTextProperty);
private set => SetValue(HasTextProperty, value);
}
public static readonly DependencyProperty HasTextProperty = DependencyProperty.Register(
nameof(HasText), typeof(bool), typeof(TextEditor), new PropertyMetadata(false));
现在,我首先尝试使用编译的绑定,但失败了(它没有显示任何错误,但它只是不起作用(:
<controls:TextEditor x:Name="SomeTextEditor"/>
<controls:SomeControl IsEnabled="{x:Bind SomeTextEditor.HasText, Mode=OneWay}"/>
然后我尝试使用经典绑定,这工作得很好:
<controls:TextEditor x:Name="SomeTextEditor"/>
<controls:SomeControl IsEnabled="{Binding ElementName=SomeTextEditor, Path=HasText}"/>
现在,我不得不说我不确定为什么会发生这种情况。dependency property
具有对通知的内置支持,否则经典绑定也不起作用。而且我没有忘记x:Bind
默认为 Mode=OneTime
,但即使手动将其设置为 Mode=OneWay
它仍然无法正常工作。
有什么想法吗?我很可能在这里错过了一些明显的东西。
谢谢! 😄
在 XAML 编译时,{x:Bind}
将转换为代码,这些代码将从数据源上的属性获取值,并在标记中指定的属性上设置该值。
指定的x:Name
将成为处理 XAML 时在基础代码中创建的字段的名称,并且该字段包含对该对象的引用。
如果使用x:Bind
绑定x:Name
字段,IsEnabled
将不会获得可用值,就像下面的代码一样。这就是以下不起作用的原因。
<controls:SomeControl IsEnabled="{x:Bind SomeTextEditor.HasText, Mode=OneWay}"/>