需要一个简短明确的“依赖属性”定义

我正在试图找出究竟是什么依赖属性,但当我在任何地方查找定义时,我只找到“如何使用”而不是“它是什么”。 想象一下,在面试时会被问到 – 什么是依赖属性。 你的答案是什么?

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

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

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

  • 它可以实现附加属性。 像Canvas.LeftGrid.Row这样的属性必须存储在从未听说过CanvasGrid ,那么你把它们放在哪里呢? 你把它们放在某个地方的数据库中。

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

“给你一堆基础设施来完成你经常想要用普通属性做的所有事情 – validation它,强制它进入适当的范围,发出变更通知,以及许多其他方面。”

WPF教程 – 依赖属性简介

依赖项属性是由WPF属性系统支持的属性,而不是声明类中的字段。

这样做的意义在于,因为WPF拥有该属性,WPF可以在计算属性值时考虑各种因素 – 例如动画,样式和数据绑定。 另一个结果是,因为属性是由WPF管理的,所以它们不必在概念上具有状态的类上声明:因此,附加属性,这允许例如Grid将特定于网格的状态与非网格对象相关联。

(顺便说一句,我之前提到过WPF,因为这是使用DP的主要框架,但Windows Workflow Foundation也有依赖属性的概念。所以要严格正确,DP是一个由外部属性支持的属性系统,特别是在获取属性值时允许“最后设定值”以外的因素发挥作用的系统。)

依赖项属性是一个属性,其中当前值依赖于(因此名称)其他方面,如默认值,validation,强制,值inheritance或动画。

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

这些是什么?

一组类和使用它们的已定义方法,它们提供上述function,用于从DependencyObjectinheritance的类。

它们不是语言function。 它们是.NET Framework的一项function。

MSDN提供了良好的定义,描述和示例

有关DependencyProperty的更深入理解,请点击此处

依赖属性依赖于多个提供程序来确定其在任何时间点的值。 这些提供者可以是不断更改其值的动画,其属性值向下传播到其子元素的父元素,依此类推。

可以说依赖属性的最大特点是它具有提供变更通知的内置function。

每当依赖项属性的值发生更改时,WPF都会自动触发许多操作,具体取决于属性的元数据。 这些操作可以重新呈现适当的元素,更新当前布局,刷新数据绑定等等。 通过此内置更改通知启用的最有趣的function之一是属性触发器,使您可以在属性值更改时执行自己的自定义操作,而无需编写任何过程代码