在实现WPF应用程序中Model-View-ViewModel (MVVM)体系结构中的ViewModel时,似乎有两种主要选择如何使其可数据绑定。我见过一些实现使用DependencyProperty来绑定View的属性,也见过ViewModel实现INotifyPropertyChanged。 我的问题是什么情况下应该优先考虑其中一种?是否存在性能差异?将依赖项提供给WPF真的是个好主意吗?在做出设计决策时还需要考虑什么?
在创建诸如按钮之类的控件时,应该使用依赖属性(Dependency Properties)。在XAML中使用属性并使用所有WPF功能,这些属性必须是依赖属性。
然而,在ViewModel中最好使用INotifyPropertyChanged。使用INotifyPropertyChanged将使您能够拥有需要的getter/setter逻辑。
我建议查看Josh Smith的ViewModel基类版本,它已经实现了INotifyPropertyChanged:
http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/
我认为这是一个很好的ViewModel示例。
只有一个原因可以选择DependencyObject
- 绑定会更好。尝试使用ListBox
和TextBox
的示例,将列表填充为来自INotifyPropertyChanged
属性的数据与DependencyProperty
进行比较,并从TextBox
编辑当前项...
我更喜欢一种更直接的方法,我在Presentation Model Without INotifyPropertyChanged中写过这个方法。使用数据绑定的替代方案,您可以直接绑定到CLR属性,而无需任何繁琐的代码。您只需在视图模型中编写普通的.NET代码,当数据模型发生更改时,它会自动更新。
如果你想将属性暴露给其他控件,你必须使用依赖属性...但祝你好运,因为它们需要一段时间来理解...
INotifyPropertyChanged
接口的 .NET 4.5 方法。 - Daniel Little