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