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

时间:2013-08-20 17:55:48

标签: c# wpf xaml properties dependency-properties

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

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

在代码后面我有两个属性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"));

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

  

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

我得到了输出 -

DPProperty

而不是

CLRProperty
DPProperty

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

1 个答案:

答案 0 :(得分:8)

绑定属性由Binding访问,而不是由声明类访问。 <{1}}之类的私有CLR属性是不可访问的,因此绑定将不起作用。

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

从链接here -

  

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