为什么WPF中的依赖属性必须是静态的?

22
为什么依赖属性必须是静态的?
我已经看到在这里的一些帖子中已经有人提出了这个问题,但我无法正确理解它。
如果有人能用一个小片段帮助我理解就太好了。

可能是非静态依赖属性的重复问题。 - M.Babcock
以上问题的答案解释相当基础,请先了解基础知识,然后我们可以讨论约束条件是否有效。 - M.Babcock
@M.Babcock:这就是我在描述中所说的,我已经看过一些解释,但它们并不全面。在写下我的问题之前,我已经看过你提供的链接,以及我也看过这个链接https://dev59.com/pXA75IYBdhLWcg3w_umD - Jasmine
我会尽可能地阅读相关资料,同时等待有人能够帮助我更好地理解它。 - Jasmine
2个回答

30
这里的魔法在于,DependencyProperty 的声明是 static 而不是它的值(即内存存储)。使用 static 关键字添加的声明仅作为特定 DependencyObjectDependencyProperty 标识符(键)而存在。由于所有实例都可以使用相同的标识符/键来标识属性值,因此将其设置为静态是有意义的。
另一方面,当我们通过在 DependencyObject 实例上调用 SetValue 来设置 DependancyProperty 的值时,调用 SetValue 的每个 DependancyObject 实例都将存储其本地属性值。这由 DependancyObject 类在内部处理,它维护了一种类似于 Dictionary 的机制,其中包含 DependancyProperty 标识符和本地值之间的映射。

非常感谢Nit,这对我帮助很大。我也在寻找一些好的代码片段,以便更好地理解它。 - Jasmine
我不理解这行代码 - “相同的标识符将由该依赖对象的所有实例共享”。如果您能够解释一下,那就太好了,因为我是编程新手:( - Jasmine
1
你可以将其作为DependancyObject必须存储依赖属性值的Dictionary的key。由于每个实例可以具有不同的属性值,但是为了识别该值,我们不需要不同的键,因为每个实例的值将对应相同的键...因此它是静态的。 - Nitin
非常感谢Nit,这帮助我更好地理解了它。干杯! - Jasmine
1
很高兴能帮到你。如果你想详细了解依赖属性的值解析,这里有一个很好的可视化表示:http://wpftutorial.net/DependencyProperties.html - Nitin
我不明白如果对象是静态的,你如何在其中管理状态。有人能解释一下吗? - rollsch

8

DependencyProperty必须是静态的(类级别),因为当我们创建一个具有该属性的类的多个对象并想要引用该属性的默认值时,该值必须来自DependencyProperty的静态实例。所以我们类的所有实例的默认值都是相同的,系统不会在该类的每个实例上保留DependencyProperty的内存。这样可以减少内存占用。

现在的问题是如果我们明确为类的对象设置DependencyProperty的值呢?(通过代码、动画或样式)

在这种情况下,DependencyObject就出现了。任何具有DependencyProperty的类必须从DependencyObject类派生(WPF特定类,维护名为EffectiveValues的集合)。当用户显式地在类的对象上(通过代码、动画或样式)设置DependencyProperty的值时,该值存储在该对象所属的DependencyObject类中的EffectiveValues集合中,并在那里保留内存。


很好的答案;不过,DependencyObject 不是仅限于 WPF 的类--它在 Silverlight 和 WinRT 中也可用。 - B.K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接