(我对这个概念完全陌生,所以我可能会问非常基本的问题。)
使用以下代码注册依赖项属性:
public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);
逻辑上,除了将属性名称与所有者类型相关联之外,它什么也没做。
因此,如果我有所有者类型的多个实例,并且每个实例都将DP设置为不同的值。
如何存储这些值?
我从这里读到了附属物: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);
但我不明白为什么附属财产必须是依赖财产?他们之间的联系是什么?
谢谢!
答案 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所讨论的GetValue
和SetValue
方法。我们可以在Window
和/或UserControl
中访问这些方法,因为它们都会扩展DependencyObject
类。您还可以看到此处的Items
属性不是 static
...这只是DependencyProperty
static
的定义。
更新&gt;&gt;&gt;
要求为什么附加属性必须是DependencyProperty
?并没有多大意义,因为在.NET中,它们只是......它们就是这样设计的。一个更好的问题可能是,附属财产从DependencyProperty
获得了什么好处?
对此的回答与属性从DependencyProperty
获得的好处相同?主要的好处是这些属性可用于{{1 }},Binding
s,Style
和Animation
等等。更多详细信息可以从MSDN上的两个非常重要的页面(已经链接到评论中)找到,适用于任何WPF开发人员:
答案 1 :(得分:3)
我一直将DependencyProperties
视为属性定义,这与普通属性不同。
属性定义包含属性类型,名称,默认值等,并包含一个指针,显示在何处查找属性值。但它本身并不包含价值。
这允许您在Bindings中使用DependencyProperties
,因为您可以将属性设置为从绑定表达式而不是从对象本身获取其值。
这对AttachedProperties
很重要,因为它们的值不会驻留在它们所附加的对象上。他们需要能够在与对象本身不同的位置查找其值,DependencyProperties
允许这样做。
您不能使用常规属性执行此操作,因为要在对象本身上找到普通属性的值,但在它附加到的对象上不存在AttachedProperty
。
这是简单的版本。 :)