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

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

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

如果有人能用小片段帮助我理解,那将是很棒的。

这里的魔力是, DependencyProperty的声明是static而不是它的value (即内存存储)。 使用static关键字添加的声明只是DependencyPropertyDependencyObject的标识符,因为该DependencyObject的所有实例将共享相同的标识符以标识属性,因此将其设置为static是有意义的。

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

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

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

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