非静态依赖属性

5

有没有任何理由我不能(或不应该)将依赖属性声明为非静态的?

我需要创建一个具有双向可绑定属性的接口。在接收端上,INotifyPropertyChanged似乎有点繁琐,因为它依赖于字符串标识符。

2个回答

13

声明依赖属性为非静态的原因是什么?是否可以这样做?

不行。

WPF中的依赖属性机制使用每个类型指定的存储机制,而不是每个实例。DP的设计依赖于它们被静态定义,而非每个实例。如果您在实例上定义它们,它们将无法正常工作。

部分原因是允许属性继承,但也允许您在对象上指定很多属性而不会在每个实例中使用很多内存。

如果您想创建具有双向可绑定属性的接口,通常会在类中使用INotifyPropertyChanged,并在用户界面元素上使用依赖属性来处理绑定。INotifyPropertyChanged是此操作的正确机制。如果主要问题是字符串标识符,您可以使用表达式树解决此问题


谢谢回复,我之前不知道DP是如何在内部实现的。一个属性既可以作为DP实现XAML UI,同时也可以通过接口公开并实现INotifyPropertyChanged,这样做是否可行? - Matěj Zábský
2
@commanderz:是的,尽管通常情况下,您会在UI元素上使用DP,并在“模型”对象上使用INPC,这些对象应该是UI的DataContext。您可以在同一对象上同时使用两者,但通常不是一个好主意,因为最好将关注点分开。 - Reed Copsey
2
@commanderz:尝试将实现INPC的应用程序逻辑与使用DP的UI分开。 - Reed Copsey

0

DependencyProperty 字段本身需要声明为静态的,包含 GetValue/SetValue 调用的包装器属性则不需要。

依赖属性内置了更改通知,因此无需执行其他任何操作即可获得该功能。为了使绑定在您的属性上默认为 Mode=TwoWay,请将 FrameworkPropertyMetadata 传递给 Register 方法,并在选项中使用 FrameworkPropertyMetadataOptions.BindsToWayByDefault 标志。


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