为什么编译的绑定不能与依赖项属性一起使用,而经典绑定可以使用?



我试图从我编写的自定义控件中的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}"/>

最新更新