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

4
我最近在学习WPF。今天发现了.Net依赖属性的一些新东西。它们带来的好处包括:
- 支持回调(验证,更改等) - 属性继承 - 附加属性
等等。
但是我的问题是为什么它们需要在包含类中声明为静态?推荐的方法是为它们添加实例“包装器”属性。为什么?
编辑: @Matt,但这是否也意味着属性值也在实例之间共享 - 除非它是派生值?
3个回答

7

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

您应该为注册的任何DP提供默认值的原因是,当将其设置为默认值时,WPF会注意不为该属性分配额外的内存,无论您创建了多少包含该属性的对象。


5

我认为需要静态实例依赖属性的原因只是因为它们是这样设计的。静态部分保存所有属性元数据 - 默认值、所有者类型(如果它是一个附加属性等)、当它发生变化时的回调方法等等。将这些内容在类的所有实例之间以静态方式存储比每个实例单独存储更合理。


2

我认为提出该要求有两个原因:

  1. 您不能注册相同的DP两次。为了遵守此约束条件,您应该使用静态变量,它只会被初始化一次,因此您只会注册DP一次。
  2. 在创建任何使用该数据库的类实例之前,必须先注册DP。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接