c# - 需要 "Dependency Properties"的简短而清晰的定义

标签 c# wpf dependency-properties

我试图弄清楚依赖属性到底是什么,但是当我在任何地方寻找定义时,我只找到“如何使用”而不是“它是什么”。 想象一下,你在面试时被问及什么是依赖属性。你会怎么回答?

最佳答案

DependencyProperty 是一种属性,其值取决于(或可以取决于)其他一些来源(例如动画、数据绑定(bind)、样式或可视化树继承)。常规属性的值存储在它所属的对象中,而您可以认为依赖属性存储在某个数据库中。该数据库基本上由一个字典组成,该字典将 (object, property) 对映射到它们的值,以及哪些属性依赖于其他属性的映射(例如,当您更改面板的 DataContext 时,它可以通知面板内的所有 child )。

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

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

  • 它启用附加属性。 Canvas.Left 等属性和 Grid.Row必须存储在从未听说过 Canvas 的对象上或 Grid ,所以你把它们放在哪里?你将它们放在某个数据库中。

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

关于c# - 需要 "Dependency Properties"的简短而清晰的定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2505234/

相关文章:

wpf DependencyProperty 不接受短默认值

wpf - 当新值相同时,DependencyProperty 不会触发 ValueChanged

c# - 如何将变量传递给重写的 toString() 方法?

c# - 如何将一种类型的通用列表转换为未知类型的通用列表

.net - 是否有一个 WPF 控件可以在类似资源管理器的 View 中显示文件列表?

wpf - 依赖属性 : Getting but not Setting

wpf - 如何使 Binding 尊重 DependencyProperty 值强制?

c# - System.Windows.Forms.Timer 继续运行

c# - 对象实例已被处置(EF)

WPF RadioButton 更改未更新 UI MVVM