2010-09-07 82 views
4

是否有任何理由不能将(或者应该)声明依赖项属性为非静态?非静态依赖项属性

我需要制作一个双向可绑定属性的接口。 INotifyPropertyChanged在接收端似乎有点麻烦,因为它依赖于字符串标识符。

回答

10

是否有任何理由为什么我可以(或应该)不声明依赖项属性为非静态?

是的。

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

这部分完成允许继承属性,但也允许您在一个对象上指定很多属性,而无需每个实例使用大量内存。

如果要制作具有双向可绑定属性的接口,通常您希望对您的类使用INotifyPropertyChanged,并且需要用户界面元素上的依赖项属性来处理绑定。 INotifyPropertyChanged是适当的机制。如果主要投诉是字符串标识符,您可以work around them using expression trees

+0

感谢您的回复,我不知道内部如何执行DP。一个属性是DP还是可以同时实现INotifyPropertyChanged(DP用于XAML UI,另一个是通过接口公开)? – 2010-09-07 16:53:54

+2

@commanderz:是的,虽然通常情况下,您将在UI元素上使用DP,在“模型”对象上使用INPC,这应该是您的UI的DataContext。你可以将两者都放在同一个对象上,但这通常不是一个好主意,因为分开你的顾虑更好。 – 2010-09-07 16:54:52

+2

@commanderz:尝试将应用程序逻辑(实现INPC)与UI(使用DP)分开, – 2010-09-07 16:55:17

0

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

依赖属性具有更改内置的通知,所以你不需要做任何额外的事情来获得它。要使属性上的绑定默认为Mode = TwoWay,请使用选项中的FrameworkPropertyMetadataOptions.BindsToWayByDefault标志将FrameworkPropertyMetadata传递给Register方法。