2010-03-24 52 views

回答

16

DependencyProperty是一个属性,其值取决于(或可能取决于)其他源(如动画,数据绑定,样式或可视化树继承)。常规属性的值存储在它所属的对象中,而您可以将依赖项属性视为存储在某个数据库中。这个数据库本质上是由一个字典组成,它将(对象,属性)对映射到它们的值,以及哪些属性依赖于其他属性的映射(例如,当您更改Panel的DataContext时,它可以通知所有小组内的儿童)。

那么为什么他们将属性值存储在某个神奇的数据库中?有几个原因:

  • 它减少了存储空间。将一个属性(即使其值为空)添加到类中,会为该类的每个实例添加4个字节(对于64位进程为8)。当实例具有值时,DependencyProperty只占用空间。例如,一个FrameworkElement有几十个依赖属性,其中大多数从来没有赋值。如果所有这些属性都存储在类中,则每个实例都会有数百个字节。相反,每个实例只有大约40个字节。

  • 它启用附加属性。诸如Canvas.LeftGrid.Row之类的属性必须存储在从未听说过CanvasGrid的对象上,因此您将它们放在哪里?你把它们放在一个数据库的某个地方。

  • 它启用自动属性更改。想象一下,你将如何实现类似于样式或属性继承的东西(能够在父元素上设置字体或数据上下文的功能,并将其值传播到所有子元素)。将所有这些存储在数据库中使得代码全部集中在一个地方,而不是针对每个需要它的对象和属性单独实现。

+0

参考第一点,字节空间问题在控件中有多个属性的winforms中从未出现过。 – thewpfguy 2010-07-31 06:56:55

+0

thewpfguy:Winforms控件由hWnds支持,它有很多开销,以致杂项事件和属性占用的字节数是不相关的。 – Gabe 2010-07-31 13:09:24

+0

这就是要点。在Winforms中,即使有很多开销 - hwnd,event,properties(有些从未分配过) - 内存使用率从来都不是问题。如果确实是一个问题,那么这个设计支持dep。支柱。也可以在那里实施。我发现在许多书籍和文章中引用了这种高效的内存空间优势,但它正在解决一个并不存在或无关紧要的问题。我相信即使这是dep的好处之一。财产应该是最不重要的一个。 – thewpfguy 2010-08-01 05:01:36

0

MSDN提供了很好的定义,描述和例子

有关的DependencyProperty的更深刻的理解检查here

2

“给你一堆的基础设施做一切你经常要与正常做的事情财产 - 验证它,强制它进入适当的范围,发布变更通知,以及其他一些方面。“

WPF Tutorial - Introduction To Dependency Properties

+0

验证,强制和更改通知都可能与常规的CLR属性以及 – gn22 2010-03-24 16:38:19

+0

感谢您分享链接,我个人发现它非常有帮助。 – 2010-11-14 13:18:49

1

一个依赖属性是受WPF属性系统,而不是通过在声明类的字段支持的属性。

这意味着,因为WPF拥有该属性,所以在计算属性值时,WPF可以考虑各种考虑因素 - 例如动画,样式和数据绑定。另一个结果是,因为属性是由WPF管理的,所以它们不必在概念上具有状态的类上声明:因此,附加属性允许例如将网格特定状态与非网格对象相关联的网格。 (顺便说一下,我之前提到过WPF,因为这是使用DP的主要框架,但Windows Workflow Foundation也具有依赖属性的概念。因此,要严格正确,DP是一个有支持的属性通过外部财产制,特别是允许“最后设定值”以外的因素在获得财产价值时起作用的系统)。

+0

这里的最佳补充信息是接受答案。 – KMC 2016-08-31 05:51:07

1

依赖关系属性是基于其他方面,如缺省值,验证,胁迫,值继承或动画,其中电流值取决于一个属性(因此而得名)。

此外,依赖属性还内置了对变更通知,数据绑定和样式的支持。

它们是什么?

一堆类和使用它们的已定义方式,它们提供上述功能以用于从DependencyObject继承的类。

它们不是语言功能。它们是.NET Framework的一个功能。

+0

谢谢。好一个。 – Freelancer 2013-06-05 12:12:52

0

依赖项属性取决于多个提供程序在任何时间点确定其值。这些提供者可以是一个不断改变它的值的动画,一个其属性值传播给它的子元素的父元素,等等。

可以说,依赖属性的最大特点是其内置的提供更改通知的功能。

只要依赖项属性的值发生更改,WPF就会根据属性的元数据自动触发多个操作。这些操作可以重新渲染适当的元素,更新当前布局,刷新数据绑定,以及更多其他功能。通过此内置更改启用的最有趣的功能之一是属性触发器,它允许您在属性值更改时执行您自己的自定义操作,而无需编写任何程序代码。