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

Roh*_*ats 4 c# wpf xaml dependency-properties properties

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

<StackPanel>
   <TextBlock Text="{Binding NameCLR}"/>
   <TextBlock Text="{Binding NameDP}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

在代码后面我有两个属性NameCLR - CLR propertyNameDP - Dependency Property.

    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"));
Run Code Online (Sandbox Code Playgroud)

由于代码隐藏是部分类定义,而部分是XAML.所以,我假设私有财产应该对XAML可见.但令我惊讶的是,CLR和DP表现不同.

私有依赖属性是可访问的,但私有CLR属性不可访问.

我把输出作为 -

DPProperty
Run Code Online (Sandbox Code Playgroud)

代替

CLRProperty
DPProperty
Run Code Online (Sandbox Code Playgroud)

有人能让我知道DP和CLR属性中的这种不同行为吗?

Cle*_*ens 8

绑定属性由Binding访问,而不是由声明类访问.私有CLR属性NameCLR是不可访问的,因此绑定将不起作用.

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

这里的链接-

通过属性系统可以将给定类型的依赖属性作为存储表访问,其XAML处理器的WPF实现使用此表,并推断通过在包含DependencyObject派生类型上调用SetValue可以更有效地设置任何给定属性ABC,依赖属性标识符ABCProperty.

  • 由于另一个原因,这很重要; 由于Binding系统直接使用依赖属性,因此它永远不会为类上公开的'友好包装器'标准属性调用getter和setter.将一些特殊逻辑放入此包装器属性的setter中是一个非常常见的错误,只是发现在Binding系统更新该值时不会调用它. (3认同)