2008-08-31 82 views
3

现在学习WPF。 .Net依赖属性今天发现了一些新东西。他们带来的表是什么为什么.Net WPF DependencyProperties必须是类的静态成员

  • 支持回调(验证,变更等)
  • 财产继承
  • 附加属性

等等。

但我在这里的问题是为什么他们需要在包含类中声明为静态?推荐的方法是为它们添加实例'wrapper'属性。为什么?

编辑: @Matt,但是这并不要求属性值也是跨实例共享 - 除非它是一个派生值?

回答

2

我看到后面要求2个原因:

  1. 不能注册同样的DP两次。为了遵守这个约束条件,你应该使用静态变量,它只会被初始化一次,因此你只会注册DP一次。
  2. DP应任何类(它使用DB)实例创建
5

我想你需要一个依赖属性的静态实例的原因真的只是因为这是他们如何设计之前进行注册。静态位保存所有的属性元数据 - 它的默认值,它的所有者类型(如果它是一个附属属性,方便)等等,它的回调方法是什么时候改变的 - 这种事情。有意义的是将这些事情静态地存储在类的所有实例中而不是每个实例。

7

由于WPF中的关键优化,依赖项属性是静态的:WPF中的许多控件具有数十个(如果不是数百个)属性。这些类中的大多数属性都设置为其默认值。如果DP是实例属性,则需要为每个创建的对象中的每个属性分配内存。由于DP是静态的,因此WPF可以更有效地管理每个属性的内存使用情况。

为什么你应该为你注册的任何DP提供一个默认值的原因是因为当WPF设置为它的默认值时,WPF将小心不要为你的属性分配额外的内存,无论你创建多少个包含该属性的对象。

相关问题