什么是 .Net 中的依赖属性(尤其在 WPF 上下文中)?与常规属性有何区别?
什么是 .Net 中的依赖属性(尤其在 WPF 上下文中)?与常规属性有何区别?
我发现的唯一有用而且写得很好的解释是这个:http://www.wpftutorial.net/dependencyproperties.html
基本上,DependancyProperties(依赖属性)与普通属性不同,它们不仅仅是类中字段的设置器/获取器,而是在运行时动态地检索它们的实际值。DPs的SetValue()
方法非常直截了当,将属性的本地值设置为给定的值。然而,当您尝试从依赖属性GetValue()
时,它首先查找本地值,如果没有(这在依赖属性中是可行的,而在普通属性中不可行),就会继续沿着逻辑UI树向上查找,直到找到该值。如果框架在未找到任何本地值的情况下达到树的顶部,则使用预定义的默认值作为属性的值。
这种方法使得DependancyProperties比普通属性消耗更少的内存,因为只有用户明确设置的值会被本地存储。
正如上面提到的,依赖属性还允许我们在XAML代码中绑定它们并对其设置触发器,这在普通属性中是不允许的。
希望我已经成功地澄清了一些模糊的问题 :)
依赖属性是从DependencyObject派生的类的属性,它们很特别,不同于使用后备字段来存储它们的值,而是使用DependencyObject上的一些辅助方法。
最好的事情是它们内置了所有数据绑定的管道。如果将某些内容绑定到它们上面,当它们发生变化时,它们会通知所绑定的内容。
http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/提供了关于WF和WPF的依赖属性的良好解释。
以下是其中的一段摘录:
重点 - 依赖属性的值是由框架解析的
与任何属性一样,依赖属性的最终目标是管理状态。但是,与普通的 .Net 属性不同,本地属性值并不存储在实例变量中。
相反,依赖属性已在依赖属性框架中注册,并且底层属性值是被解析的 - 这意味着基于属性注册定义的规则,依赖属性框架确定了该值。
Grid.Row="1"
将使其在父级Grid
的第二行(由于行从零开始计数)中,但Row
依赖属性属于Grid
对象。 - Jonathan PerryDataTrigger
并设置Binding={Binding Path=Value, Value=1}
来实现这一点。 - Jonathan Perry