我想弄清楚什么是依赖属性,但是当我在任何地方寻找定义时,我只找到“如何使用”而不是“它是什么”。 想象一下,你在面试时被问到 - 什么是依赖财产。你的答案是什么?需要一个简短明确的“依赖属性”的定义
回答
DependencyProperty是一个属性,其值取决于(或可能取决于)其他源(如动画,数据绑定,样式或可视化树继承)。常规属性的值存储在它所属的对象中,而您可以将依赖项属性视为存储在某个数据库中。这个数据库本质上是由一个字典组成,它将(对象,属性)对映射到它们的值,以及哪些属性依赖于其他属性的映射(例如,当您更改Panel的DataContext时,它可以通知所有小组内的儿童)。
那么为什么他们将属性值存储在某个神奇的数据库中?有几个原因:
它减少了存储空间。将一个属性(即使其值为空)添加到类中,会为该类的每个实例添加4个字节(对于64位进程为8)。当实例具有值时,DependencyProperty只占用空间。例如,一个FrameworkElement有几十个依赖属性,其中大多数从来没有赋值。如果所有这些属性都存储在类中,则每个实例都会有数百个字节。相反,每个实例只有大约40个字节。
它启用附加属性。诸如
Canvas.Left
和Grid.Row
之类的属性必须存储在从未听说过Canvas
或Grid
的对象上,因此您将它们放在哪里?你把它们放在一个数据库的某个地方。它启用自动属性更改。想象一下,你将如何实现类似于样式或属性继承的东西(能够在父元素上设置字体或数据上下文的功能,并将其值传播到所有子元素)。将所有这些存储在数据库中使得代码全部集中在一个地方,而不是针对每个需要它的对象和属性单独实现。
“给你一堆的基础设施做一切你经常要与正常做的事情财产 - 验证它,强制它进入适当的范围,发布变更通知,以及其他一些方面。“
验证,强制和更改通知都可能与常规的CLR属性以及 – gn22 2010-03-24 16:38:19
感谢您分享链接,我个人发现它非常有帮助。 – 2010-11-14 13:18:49
一个依赖属性是受WPF属性系统,而不是通过在声明类的字段支持的属性。
这意味着,因为WPF拥有该属性,所以在计算属性值时,WPF可以考虑各种考虑因素 - 例如动画,样式和数据绑定。另一个结果是,因为属性是由WPF管理的,所以它们不必在概念上具有状态的类上声明:因此,附加属性允许例如将网格特定状态与非网格对象相关联的网格。 (顺便说一下,我之前提到过WPF,因为这是使用DP的主要框架,但Windows Workflow Foundation也具有依赖属性的概念。因此,要严格正确,DP是一个有支持的属性通过外部财产制,特别是允许“最后设定值”以外的因素在获得财产价值时起作用的系统)。
这里的最佳补充信息是接受答案。 – KMC 2016-08-31 05:51:07
依赖关系属性是基于其他方面,如缺省值,验证,胁迫,值继承或动画,其中电流值取决于一个属性(因此而得名)。
此外,依赖属性还内置了对变更通知,数据绑定和样式的支持。
它们是什么?
一堆类和使用它们的已定义方式,它们提供上述功能以用于从DependencyObject继承的类。
它们不是语言功能。它们是.NET Framework的一个功能。
谢谢。好一个。 – Freelancer 2013-06-05 12:12:52
依赖项属性取决于多个提供程序在任何时间点确定其值。这些提供者可以是一个不断改变它的值的动画,一个其属性值传播给它的子元素的父元素,等等。
可以说,依赖属性的最大特点是其内置的提供更改通知的功能。
只要依赖项属性的值发生更改,WPF就会根据属性的元数据自动触发多个操作。这些操作可以重新渲染适当的元素,更新当前布局,刷新数据绑定,以及更多其他功能。通过此内置更改启用的最有趣的功能之一是属性触发器,它允许您在属性值更改时执行您自己的自定义操作,而无需编写任何程序代码。
- 1. 从另一个依赖指定的依赖性明确Maven的
- 2. 简单的依赖属性?
- 3. 绑定依赖属性到另一个依赖属性
- 4. asp.net自定义控件属性依赖于另一个属性
- 5. 依赖属性依赖于另一个
- 6. Silverlight简单绑定/依赖属性
- 7. 自定义依赖属性绑定
- 8. 需要“委托”的简明定义
- 9. 我只需要一个依赖模块,但不需要它的依赖关系
- 10. 访问自定义依赖属性的所有属性PropertyChangedCallback
- 11. 为什么Shake依赖关系是明确“需要”的?
- 12. 声明样式。指定一个属性是绝对需要的
- 13. 绑定依赖属性
- 14. 需要一个(简单)的SQLite声明
- 15. 具有依赖于WPF中另一个属性值的依赖属性值是否正确?
- 16. 依赖属性
- 17. 依赖属性
- 18. WPF - 如何绑定到一个依赖属性自定义类的
- 19. 自定义需要的属性
- 20. 简单的makefile问题(用一个简单的依赖性)
- 21. 如何在VB.Net 3.0中声明一个依赖属性
- 22. WPF:CLR属性依赖属性
- 23. 依赖于其他属性的依赖属性
- 24. 测试依赖于另一个属性的验证属性
- 25. Angular2依赖注入:创建一个最初未定义的属性的引用
- 26. 属性依赖于另一个字段
- 27. 绑定到自定义控件的嵌套依赖项属性
- 28. Silverlight绑定到自定义控件中的依赖属性
- 29. 依赖属性上的XAML绑定
- 30. UserControl中的依赖属性绑定
参考第一点,字节空间问题在控件中有多个属性的winforms中从未出现过。 – thewpfguy 2010-07-31 06:56:55
thewpfguy:Winforms控件由hWnds支持,它有很多开销,以致杂项事件和属性占用的字节数是不相关的。 – Gabe 2010-07-31 13:09:24
这就是要点。在Winforms中,即使有很多开销 - hwnd,event,properties(有些从未分配过) - 内存使用率从来都不是问题。如果确实是一个问题,那么这个设计支持dep。支柱。也可以在那里实施。我发现在许多书籍和文章中引用了这种高效的内存空间优势,但它正在解决一个并不存在或无关紧要的问题。我相信即使这是dep的好处之一。财产应该是最不重要的一个。 – thewpfguy 2010-08-01 05:01:36