19

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

我已经看到它已经在这里的一些帖子中被问过,但我无法正确理解它。

如果有人也可以用一个小片段帮助我理解,那就太好了。

4

2 回答 2

30

这里的神奇之处在于,它的声明DependencyProperty不是static它的value(即内存存储)。您使用关键字添加的声明static只是特定的标识符(键DependencyPropertyDependencyObject。由于 DependencyObject 的所有实例都可以使用相同的标识符/键来标识属性值,因此它是有意义的static

另一方面,当我们DependancyProperty通过调用SetValueonDependancyObject实例设置 value 时,调用 SetValue 的每个实例DependancyObject都将存储其 Property 的本地值。DependancyObject这由维护排序的类在内部处理,该类具有标识符和本地值Dictionary之间的映射。DependancyProperty

于 2013-10-18T04:38:22.727 回答
7

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

现在下一个问题出现了,如果我们为类的对象显式设置 DependencyProperty 的值会怎样。(通过代码或动画或样式)

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

于 2014-02-20T06:50:30.397 回答