与私有CLR属性相比,与私有依赖属性绑定的工作方式不同

本文关键字:属性 工作 方式不 绑定 CLR 依赖 | 更新日期: 2023-09-27 18:28:19

我有一个窗口,它的DataContext通过这个简单的XAML布局-设置为自己

<StackPanel>
   <TextBlock Text="{Binding NameCLR}"/>
   <TextBlock Text="{Binding NameDP}"/>
</StackPanel>

在代码后面,我有两个属性CCD_ 1和CCD_。

    private string NameCLR
    {
        get { return "CLRProperty"; }
    }
    private string NameDP
    {
        get { return (string)GetValue(NameDPProperty); }
        set { SetValue(NameDPProperty, value); }
    }
    private static readonly DependencyProperty NameDPProperty =
        DependencyProperty.Register("NameDP", typeof(string), typeof(MainWindow),
                                        new UIPropertyMetadata("DPProperty"));

由于代码隐藏是分部类定义,分部是XAML。所以,我假设私有属性应该对XAML可见。但令我惊讶的是CLR和DP的行为不同。

Private Dependency属性可访问,但专用CLR属性不是。

我得到的输出是-

DPProperty

而不是

CLRProperty
DPProperty

有人能告诉我DP和CLR属性中的这种不同行为吗?

与私有CLR属性相比,与私有依赖属性绑定的工作方式不同

绑定属性由Binding访问,而不是由声明类访问。像NameCLR这样的专用CLR属性是不可访问的,因此绑定无法工作。

然而,当解析属性路径NameDP时,Binding显然绕过了该属性的CLR包装,并直接访问底层依赖属性,该依赖属性是通过调用DependencyProperty.Register向依赖属性系统注册的。将返回的DependencyProperty引用分配给类中的私有或公共静态字段并不重要。依赖项属性是为您的类注册的,因此可以查找它。

从这里的链接-

给定类型的依赖项属性可以作为存储访问表的XAML的WPF实现处理器使用该表并推断任何给定的属性ABC都可以通过在包含DependencyObject派生类型,使用dependency属性标识符ABCProperty。