为什么.Net WPF DependencyProperties必须是该类的静态成员

时间:2020-03-05 18:45:37  来源:igfitidea点击:

如今学习WPF。 .Net依赖项属性今天发现了一些新东西。他们带来的是

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

其中。

但是我的问题是,为什么需要在包含的类中将它们声明为静态的?建议的方法是为它们添加实例的"包装"属性。为什么 ?

编辑:
@Matt,但是这是否还要求所有实例之间也共享属性值,除非它当然是派生值?

解决方案

回答

我看到该要求背后的两个原因:

  • 我们不能两次注册同一张DP。为了遵守这一约束,我们应该使用静态变量,它只会被初始化一次,因此我们只能注册一次DP。
  • DP应该在创建任何类(使用该DB)的实例之前注册

回答

我认为我们需要依赖项属性的静态实例的原因确实只是因为这是它们的设计方式。静态位将所有属性元数据保留为其默认值,其所有者类型(如果是添加属性,则为方便)等,以及在其更改此类内容时的回调方法。将这些东西静态地存储在类的所有实例中而不是按实例存储是有意义的。

回答

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

之所以要为注册的所有DP提供默认值,是因为WPF将注意在将属性设置为默认值时,不要为属性分配额外的内存,无论创建了多少包含该属性的对象。