【发布时间】:2010-09-07 16:40:21
【问题描述】:
我有什么理由可以(或不应该)将依赖属性声明为非静态的?
我需要创建一个具有双向可绑定属性的接口。 INotifyPropertyChanged 在接收端似乎有点麻烦,因为它依赖于字符串标识符。
【问题讨论】:
标签: wpf
我有什么理由可以(或不应该)将依赖属性声明为非静态的?
我需要创建一个具有双向可绑定属性的接口。 INotifyPropertyChanged 在接收端似乎有点麻烦,因为它依赖于字符串标识符。
【问题讨论】:
标签: wpf
我有什么理由可以(或不应该)将依赖属性声明为非静态的吗?
是的。
WPF 中的依赖属性机制使用按类型指定的存储机制,而不是按实例指定的存储机制。 DPs 的设计依赖于它们是静态定义的,而不是每个实例。如果您在实例上定义它们,它们将无法正常工作。
这样做的部分原因是为了允许继承属性,但也允许您在对象上指定大量属性,而无需为每个实例使用大量内存。
如果您想创建一个具有双向可绑定属性的界面,通常您希望为您的类使用 INotifyPropertyChanged,并使用用户界面元素上的依赖属性来处理绑定。 INotifyPropertyChanged 是正确的机制。如果主要抱怨的是字符串标识符,您可以work around them using expression trees。
【讨论】:
DependencyProperty 字段本身需要声明为静态,包含 GetValue/SetValue 调用的包装器属性则不需要。
依赖属性内置了更改通知,因此您不需要做任何额外的事情来获得它。要使您的属性上的 Bindings 默认为 Mode=TwoWay,请将 FrameworkPropertyMetadata 传递给 Register 方法,并在选项中使用 FrameworkPropertyMetadataOptions.BindsToWayByDefault 标志。
【讨论】: