依赖属性如何告诉对象应用于?

时间:2013-10-29 15:28:23

标签: wpf dependency-properties

(我对这个概念完全陌生,所以我可能会问非常基本的问题。)

使用以下代码注册依赖项属性:

public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);

逻辑上,除了将属性名称与所有者类型相关联之外,它什么也没做。

因此,如果我有所有者类型的多个实例,并且每个实例都将DP设置为不同的值。

如何存储这些值?

更新1 - 2013年10月30日上午10:04

我从这里读到了附属物:http://wpftutorial.net/DependencyProperties.html

  

附加属性

     

附加属性是一种特殊的DependencyProperties。他们   允许您将值附加到不知道任何内容的对象   关于这个价值。

     

这个概念的一个很好的例子是布局面板。每个布局面板   需要不同的数据来对齐其子元素。画布需要Top   和左,DockPanel需要Dock等。因为你可以编写自己的   布局面板,列表是无限的。所以你看,这是不可能的   在所有WPF控件上都有这些属性。

     

解决方案是附加属性。它们由控件定义   需要来自特定上下文中另一个控件的数据。对于   示例由父布局面板对齐的元素。

所以在下面的代码片段中:

<Canvas>
    <Button Canvas.Top="20" Canvas.Left="20" Content="Click me!"/>
    <Button Canvas.Top="40" Canvas.Left="20" Content="Click me!"/>
</Canvas>

显然我们无法将所有对齐属性(例如顶部左侧)提供给Button。所以Canvas定义了这样的属性,它们对Button控件“附加”。

当Canvas.Top被指定为XAML中Button的“属性”时,它将调用Canvas类型中定义的SetTop()方法。 Button作为元素参数传入。 我认为这就是Canvas如何知道哪个Button使用哪个Top值。

public static void SetTop(UIElement element, double length);

但我不明白为什么附属财产必须是依赖财产?他们之间的联系是什么?

谢谢!

2 个答案:

答案 0 :(得分:4)

通常在我们定义DependencyProperty时,我们还定义了一个CLR“包装器”,使我们能够在代码中使用DependencyProperty

public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
    "Items", typeof(ObservableCollection<string>), typeof(MainWindow), 
     new UIPropertyMetadata(new ObservableCollection<string>()));

public ObservableCollection<string> Items
{
    get { return (ObservableCollection<string>)GetValue(ItemsProperty); }
    set { SetValue(ItemsProperty, value); }
}

在这里,您可以看到@Clemens所讨论的GetValueSetValue方法。我们可以在Window和/或UserControl中访问这些方法,因为它们都会扩展DependencyObject类。您还可以看到此处的Items属性不是 static ...这只是DependencyProperty static的定义。


更新&gt;&gt;&gt;

要求为什么附加属性必须是DependencyProperty并没有多大意义,因为在.NET中,它们只是......它们就是这样设计的。一个更好的问题可能是,附属财产从DependencyProperty获得了什么好处?

对此的回答与属性从DependencyProperty获得的好处相同?主要的好处是这些属性可用于{{1 }},Binding s,StyleAnimation等等。更多详细信息可以从MSDN上的两个非常重要的页面(已经链接到评论中)找到,适用于任何WPF开发人员:

Dependency Properties Overview

Attached Properties Overview

答案 1 :(得分:3)

我一直将DependencyProperties视为属性定义,这与普通属性不同。

属性定义包含属性类型,名称,默认值等,并包含一个指针,显示在何处查找属性值。但它本身并不包含价值。

这允许您在Bindings中使用DependencyProperties,因为您可以将属性设置为从绑定表达式而不是从对象本身获取其值。

这对AttachedProperties很重要,因为它们的值不会驻留在它们所附加的对象上。他们需要能够在与对象本身不同的位置查找其值,DependencyProperties允许这样做。

您不能使用常规属性执行此操作,因为要在对象本身上找到普通属性的值,但在它附加到的对象上不存在AttachedProperty

这是简单的版本。 :)