什么是依赖项属性?


Answers:


94

依赖项属性是从DependencyObject派生的类的属性,它们的特殊之处在于,它们不仅仅使用后备字段来存储其值,而是在DependencyObject上使用一些辅助方法。

关于它们的最好的事情是它们内置了所有用于数据绑定的管道。如果您将某些内容绑定到它们,则它们将在更改时通知它。


36
这仍然告诉我很少有关依赖属性可以做什么或为什么存在的知识。您没有提到它们最有价值的属性,即元素树的值解析。
ProfK

嗨@MattHamilton谢谢您的回答-但是“它们在DependencyObject上使用一些辅助方法”是什么意思?
BKSpurgeon '16

2
@BKSpurgeon DependencyObject具有一些方法,例如“ SetValue”和“ GetValue”,您可以调用这些方法来保存/读取依赖项属性的值,而不是使用后备字段。
马特·汉密尔顿

91

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

基本上,DependencyProperties与常规属性的不同之处在于它们不仅是类中字段的设置器/获取器,而且它们在运行时会动态地检索其实际值。SetValue()DP 的方法非常简单,将属性的本地值设置为您赋予它的值。但是,当您尝试GetValue()从DependencyProperty获取时,它将首先查找一个本地值,如果不存在任何本地值(与常规属性不同,该值在DependencyProperties中是可行的),它将继续在逻辑UI树中继续查找直到找到该值。如果框架到达树的顶部而没有找到任何本地值,则它将使用预定义的默认值作为属性的值。

与常规属性相比,此方法允许DependencyProperties消耗更少的内存,因为仅将用户明确设置的值存储在本地。

而且,如上所述,DependencyProperties还允许我们在XAML代码中绑定到它们,并在它们上设置触发器,这在常规属性上是不允许的。

我希望我已经解决了一些模糊的问题:)


2
什么是“附加财产”?
Paul-Sebastian Manole

12
附加属性是不属于正在声明的当前项目的属性,但会影响另一个对象。例如:Grid.Row="1"Button上将其设置为在父对象的第2行中Grid(由于行从零开始),但是RowDependencyProperty属于该Grid对象。
乔纳森·佩里

2
当您说时DependencyProperties also allow us to bind to them in the XAML code and set triggers on them, which on regular properties is not allowed,是否表示不允许同时绑定XAML和设置触发器,也不能仅设置触发器。感谢您的跟进,并帮助您使事情变得更清楚!
Paul-Sebastian Manole

@ Paul-SebastianManole DataTriggers也在常规属性上工作。假设您有一个Value值为0 的属性(非DP),并且希望视图Value更改为1 时可以执行某些操作。您可以使用DataTrigger并设置Binding={Binding Path=Value, Value=1}
Jonathan Perry

36

http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/很好地解释了WF和WPF中的依赖项属性。

摘录:

关键点–依赖属性的值已解析

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

而是,将依赖项属性注册到依赖项属性框架,并解析基础属性值-这意味着该值由依赖项属性框架基于属性注册定义的规则确定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.