为什么依赖属性必须是静态的?
我已经看到在这里的一些帖子中已经有人提出了这个问题,但我无法正确理解它。
如果有人能用一个小片段帮助我理解就太好了。
我已经看到在这里的一些帖子中已经有人提出了这个问题,但我无法正确理解它。
如果有人能用一个小片段帮助我理解就太好了。
DependencyProperty
的声明是 static
而不是它的值(即内存存储)。使用 static
关键字添加的声明仅作为特定 DependencyObject
的 DependencyProperty
标识符(键)而存在。由于所有实例都可以使用相同的标识符/键来标识属性值,因此将其设置为静态是有意义的。DependencyObject
实例上调用 SetValue
来设置 DependancyProperty
的值时,调用 SetValue 的每个 DependancyObject
实例都将存储其本地属性值。这由 DependancyObject
类在内部处理,它维护了一种类似于 Dictionary
的机制,其中包含 DependancyProperty
标识符和本地值之间的映射。DependencyProperty必须是静态的(类级别),因为当我们创建一个具有该属性的类的多个对象并想要引用该属性的默认值时,该值必须来自DependencyProperty的静态实例。所以我们类的所有实例的默认值都是相同的,系统不会在该类的每个实例上保留DependencyProperty的内存。这样可以减少内存占用。
现在的问题是如果我们明确为类的对象设置DependencyProperty的值呢?(通过代码、动画或样式)
在这种情况下,DependencyObject就出现了。任何具有DependencyProperty的类必须从DependencyObject类派生(WPF特定类,维护名为EffectiveValues的集合)。当用户显式地在类的对象上(通过代码、动画或样式)设置DependencyProperty的值时,该值存储在该对象所属的DependencyObject类中的EffectiveValues集合中,并在那里保留内存。