4

我有一个使用这个简单的 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 的行为不同。

Private Dependency 属性可访问,但私有 CLR 属性不可访问。

我得到的输出为 -

DPProperty

代替

CLRProperty
DPProperty

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

4

1 回答 1

8

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

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

这里的链接-

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

于 2013-08-20T18:09:11.017 回答