什么是依赖属性?

142

什么是 .Net 中的依赖属性(尤其在 WPF 上下文中)?与常规属性有何区别?

3个回答

100

我发现的唯一有用而且写得很好的解释是这个:http://www.wpftutorial.net/dependencyproperties.html

基本上,DependancyProperties(依赖属性)与普通属性不同,它们不仅仅是类中字段的设置器/获取器,而是在运行时动态地检索它们的实际值。DPs的SetValue()方法非常直截了当,将属性的本地值设置为给定的值。然而,当您尝试从依赖属性GetValue()时,它首先查找本地值,如果没有(这在依赖属性中是可行的,而在普通属性中不可行),就会继续沿着逻辑UI树向上查找,直到找到该值。如果框架在未找到任何本地值的情况下达到树的顶部,则使用预定义的默认值作为属性的值。

这种方法使得DependancyProperties比普通属性消耗更少的内存,因为只有用户明确设置的值会被本地存储。

正如上面提到的,依赖属性还允许我们在XAML代码中绑定它们并对其设置触发器,这在普通属性中是不允许的。

希望我已经成功地澄清了一些模糊的问题 :)


2
什么是“附加属性”? - Paul-Sebastian Manole
16
附加属性是一种不属于当前声明对象但会影响其他对象的属性。例如,在按钮上添加 Grid.Row="1" 将使其在父级 Grid 的第二行(由于行从零开始计数)中,但 Row 依赖属性属于 Grid 对象。 - Jonathan Perry
2
当你说“DependencyProperties 还允许我们在 XAML 代码中绑定并设置触发器,而常规属性则不允许”,你是指可以在 XAML 中进行绑定和设置触发器,还是仅指设置触发器不允许。感谢您的跟进和帮助澄清问题! - Paul-Sebastian Manole
@DataTriggers也适用于普通属性。假设您有一个值为0的“Value”属性(非DP),并且当“Value”更改为1时,您希望视图执行某些操作。您可以使用DataTrigger并设置Binding={Binding Path=Value, Value=1}来实现这一点。 - Jonathan Perry

92

依赖属性是从DependencyObject派生的类的属性,它们很特别,不同于使用后备字段来存储它们的值,而是使用DependencyObject上的一些辅助方法。

最好的事情是它们内置了所有数据绑定的管道。如果将某些内容绑定到它们上面,当它们发生变化时,它们会通知所绑定的内容。


45
这仍然很少告诉我关于依赖属性可以做什么,或者为什么存在。你没有提到它们最有价值的属性,即沿着元素树进行值解析。 - ProfK
1
嗨@MattHamilton,谢谢你的回答 - 但是你所说的“它们在DependencyObject上使用一些辅助方法”是什么意思? - BenKoshy
2
DependencyObject有一些方法,如“SetValue”和“GetValue”,您可以调用它们来保存/读取依赖属性的值,而不是使用后备字段。 - Matt Hamilton

37

http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/提供了关于WF和WPF的依赖属性的良好解释。

以下是其中的一段摘录:

重点 - 依赖属性的值是由框架解析的

与任何属性一样,依赖属性的最终目标是管理状态。但是,与普通的 .Net 属性不同,本地属性值并不存储在实例变量中。

相反,依赖属性已在依赖属性框架中注册,并且底层属性值是被解析的 - 这意味着基于属性注册定义的规则,依赖属性框架确定了该值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接