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

时间:2013-10-18 04:12:40

标签: c# .net wpf c#-4.0 dependency-properties

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

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

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

2 个答案:

答案 0 :(得分:26)

这里的魔力是,DependencyProperty的声明是static而不是value(即内存存储)。您使用static关键字添加的声明只是特定DependencyProperty的{​​{1}}的标识符(键)。由于DependencyObject的所有实例都可以使用相同的标识符/键来标识属性值,因此使其成为DependencyObject是有意义的。

另一方面,当我们通过调用static实例上的DependancyProperty来设置SetValue的值时,然后调用SetValue的每个DependancyObject实例将存储其属性的本地值。这由DependancyObject类在内部处理,它保持DependancyObject的排序,Dictionary标识符与本地值之间的映射。

答案 1 :(得分:6)

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

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

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