首页 > 解决方案 > 为什么编译绑定不能与依赖属性一起使用,但经典绑定可以?

问题描述

我试图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}"/>

现在,我不得不说我不确定为什么会这样。Adependency property内置了对通知的支持,否则经典绑定也不起作用。而且我没有忘记x:Bind默认设置为Mode=OneTime,但即使手动将其设置为Mode=OneWay它仍然无法正常工作。

有任何想法吗?我很可能在这里遗漏了一些明显的东西。

谢谢!

标签: c#xamluwpwindows-10windows-10-universal

解决方案


在 XAML 编译时,{x:Bind}将转换为代码,该代码将从数据源的属性中获取值,并将其设置在标记中指定的属性上。

指定x:Name的成为处理 XAML 时在基础代码中创建的字段的名称,并且该字段包含对对象的引用。

如果您使用x:Bind绑定x:Name字段,IsEnabled将不会像以下代码一样获得可用值。这就是为什么以下不起作用的原因。

<controls:SomeControl IsEnabled="{x:Bind SomeTextEditor.HasText, Mode=OneWay}"/>

推荐阅读