当在一个模型-视图-视图模型架构的WPF应用程序中实现ViewModel时,似乎有两个主要的选择:如何使它可数据化。我已经看到实现使用DependencyProperty属性的视图要绑定,我已经看到ViewModel实现INotifyPropertyChanged代替。

我的问题是,什么时候我应该更喜欢其中一个?有什么性能差异吗?把ViewModel依赖项交给WPF真的是个好主意吗?在做设计决定时,我还需要考虑什么?


当前回答

我认为DependencyProperty和INotifyPropertyChanged在绑定中用于两种不同的事情:第一个用于使一个属性成为绑定的目标并接收来自另一个属性的输入(使用{Binding…}来设置属性),当你想要一个属性的值被用作绑定的源(绑定路径表达式中的名称)时,最后一个。 所以选择仅仅是技术上的。

其他回答

我更喜欢一种更直接的方法,我在没有INotifyPropertyChanged的表示模型中写过。使用数据绑定的替代方案,您可以直接绑定到CLR属性,而不需要任何簿记代码。您只需在视图模型中编写普通的。net代码,当数据模型发生变化时,它就会更新。

依赖属性是自定义控件创建的粘合剂。如果你想在XAML设计时使用Intelli-sense在属性窗口中显示你的属性,你必须使用Dependency属性。INPC在设计时永远不会在属性窗口中显示属性。

如果你想将属性暴露给其他控件,你必须使用Dependency属性…但祝你好运,因为他们需要一段时间来弄清楚…

选择DependencyObject的原因只有一个——绑定会工作得更好。只是尝试一个ListBox和TextBox的例子,用INotifyPropertyChanged属性与DependencyProperty的数据填充列表,并从TextBox编辑当前项目…

看起来依赖属性应该用在你创建的控件中,比如按钮。要在XAML中使用属性并使用所有WPF特性,这些属性必须具有依赖属性。

然而,你的ViewModel最好使用INotifyPropertyChanged。使用INotifyPropertyChanged可以让你在需要的时候拥有getter/setter逻辑。

我建议查看Josh Smith的基类版本,它已经实现了INotifyPropertyChanged:

http://joshsmithonwpf.wordpress.com/2007/08/29/a-base-class-which-implements-inotifypropertychanged/

我认为这是如何创建ViewModel的一个很好的例子。