为什么.Net WPF DependencyProperties 必须是类的静态成员
题
最近正在学习WPF。今天发现了一些关于 .Net 依赖属性的新东西。他们带来的是
- 支持回调(验证、更改等)
- 财产继承
- 附加属性
除其他外。
但我的问题是为什么它们需要在包含类中声明为静态?推荐的方法是为它们添加实例“wrapper”属性。为什么 ?
编辑:@Matt,但这是否也要求属性值也在实例之间共享 - 当然除非它是派生值?
解决方案
我认为该要求背后有两个原因:
- 您不能两次注册同一个 DP。为了遵守这一约束,您应该使用静态变量,它只会被初始化一次,因此您只需注册 DP 一次。
- DP 应在创建任何类(使用该数据库)实例之前注册
其他提示
由于 WPF 中的一项关键优化,依赖属性是静态的:WPF 中的许多控件都具有数十个(甚至数百个)属性。这些类中的大多数属性都设置为其默认值。如果 DP 是实例属性,则需要为您创建的每个对象中的每个属性分配内存。由于 DP 是静态的,WPF 可以更有效地管理每个属性的内存使用情况。
您应该为您注册的任何 DP 提供默认值的原因是,当您的属性设置为默认值时,WPF 会注意不要为您的属性分配额外的内存,无论您创建了多少个包含该属性的对象。
我认为您需要依赖属性的静态实例的原因实际上只是因为它们就是这样设计的。静态位保存所有属性元数据 - 它的默认值,它的所有者类型(如果它是附加属性,则很方便)等,它更改时的回调方法 - 诸如此类的事情。在类的所有实例中而不是在每个实例中静态存储这些内容是有意义的。
不隶属于 StackOverflow