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

时间:2019-04-16 17:48:06

标签: c# xaml uwp windows-10 windows-10-universal

我试图在我编写的自定义控件中通过dependency property设置绑定,但我发现绑定没有正确更新。我应该注意,我只是绑定 from 该属性。

该属性非常标准,例如:

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之后,它仍然无法正常工作。

有什么想法吗?我很可能会在这里遗漏一些明显的东西。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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