有没有任何理由我不能(或不应该)将依赖属性声明为非静态的?
我需要创建一个具有双向可绑定属性的接口。在接收端上,INotifyPropertyChanged似乎有点繁琐,因为它依赖于字符串标识符。
有没有任何理由我不能(或不应该)将依赖属性声明为非静态的?
我需要创建一个具有双向可绑定属性的接口。在接收端上,INotifyPropertyChanged似乎有点繁琐,因为它依赖于字符串标识符。
声明依赖属性为非静态的原因是什么?是否可以这样做?
不行。
WPF中的依赖属性机制使用每个类型指定的存储机制,而不是每个实例。DP的设计依赖于它们被静态定义,而非每个实例。如果您在实例上定义它们,它们将无法正常工作。
部分原因是允许属性继承,但也允许您在对象上指定很多属性而不会在每个实例中使用很多内存。
如果您想创建具有双向可绑定属性的接口,通常会在类中使用INotifyPropertyChanged,并在用户界面元素上使用依赖属性来处理绑定。INotifyPropertyChanged是此操作的正确机制。如果主要问题是字符串标识符,您可以使用表达式树解决此问题。
DependencyProperty 字段本身需要声明为静态的,包含 GetValue/SetValue 调用的包装器属性则不需要。
依赖属性内置了更改通知,因此无需执行其他任何操作即可获得该功能。为了使绑定在您的属性上默认为 Mode=TwoWay,请将 FrameworkPropertyMetadata 传递给 Register 方法,并在选项中使用 FrameworkPropertyMetadataOptions.BindsToWayByDefault 标志。