【发布时间】:2013-10-29 15:28:23
【问题描述】:
(我对这个概念完全陌生,所以我可能会问一些非常基本的问题。)
使用以下代码注册依赖属性:
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。他们 允许您将值附加到不知道任何内容的对象 关于这个值。
布局面板就是这个概念的一个很好的例子。每个布局面板 需要不同的数据来对齐其子元素。帆布需要顶部 和左,DockPanel需要Dock等。既然可以自己写 布局面板,列表是无限的。所以你看,这是不可能的 在所有 WPF 控件上具有所有这些属性。
解决方案是附加属性。它们由控件定义 在特定上下文中需要来自另一个控件的数据。为了 例如由父布局面板对齐的元素。
所以在下面的代码sn-p中:
<Canvas>
<Button Canvas.Top="20" Canvas.Left="20" Content="Click me!"/>
<Button Canvas.Top="40" Canvas.Left="20" Content="Click me!"/>
</Canvas>
显然我们不能将 Top、Left 等所有对齐属性都赋予 Button。所以 Canvas 定义了这样的属性,它们“附加”到 Button 控件。
当 Canvas.Top 在 XAML 中被指定为 Button 的“属性”时,它将调用在 Canvas 类型中定义的 SetTop() 方法。并且 Button 作为元素参数传入。 我认为这就是 Canvas 知道哪个 Button 使用哪个 Top 值的方式。
public static void SetTop(UIElement element, double length);
但我不明白为什么附加属性必须是依赖属性?它们之间有什么联系?
谢谢!
【问题讨论】:
-
这是由 DependencyObject 班级完成的。您不能在任何不是 DependencyObject 的对象上设置依赖属性。 DependencyObject 定义方法 GetValue 和 SetValue(以及其他一些方法)来获取/设置依赖属性值。这一切都在 MSDN 上的Dependency Properties Overview 文章中进行了解释。
-
这是我读过的关于此类问题的最佳教程之一。和它简单的英语。 :) wpftutorial.net/DependencyProperties.html 你应该记住的是,你不必关心幕后发生的事情,你只需要知道全局定义的字典和散列集维护依赖属性。那些家伙太坏了,他们跑得非常快,允许属性继承、属性动画和依赖属性值优先级。 :) 顺便说一句,就像 Clemens 已经说过的那样,如果没有 DependencyObject,这个概念就行不通。
-
“但我不明白为什么附加属性必须是依赖属性?”。仅仅因为获取和设置附加属性的值也是由
DependencyObject.GetValue和DependencyObject.SetValue完成的。Canvas.SetTop(e, t)只需调用e.SetValue(Canvas.TopProperty, t)。 -
这一切都在 MSDN 上的Attached Properties Overview 文章中进行了解释。
-
@smwikipedia - 附加属性是一个依赖属性,因为它还需要支持绑定、动画和属性元数据。这还不够公平吗?