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

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


当前回答

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

其他回答

Kent写了一篇关于这个主题的有趣博客:视图模型:POCOs与依赖对象。

简短的总结:

DependencyObjects没有被标记为 可序列化的 DependencyObject类重写并密封Equals()和 GetHashCode方法()方法 DependencyObject具有线程相关性——它只能被访问 就在那根线上 创建

我更喜欢POCO方法。PresentationModel(又名ViewModel)实现INotifyPropertyChanged接口的基类可以在这里找到:http://compositeextensions.codeplex.com

把ViewModel依赖项交给WPF真的是个好主意吗?

. net 4.0将有System.Xaml.dll,所以你不必依赖于任意的框架来利用它。请参阅Rob Relyea关于他的PDC会议的帖子。

我的看法

XAML是一种描述对象的语言,而WPF是一种框架,其描述对象是UI元素。

它们的关系类似于c#(一种描述逻辑的语言)和。net(一种实现特定类型逻辑的框架)。

XAML的目的是声明性的对象图。W*F技术是这种范例的很好的候选者,但是XAML独立于它们而存在。

XAML和整个依赖系统是作为WF和WPF的独立堆栈实现的,可能是为了利用不同团队的经验,而不会在它们之间创建依赖关系(没有双关语)。

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

最近我也不得不考虑这个决定。

我发现INotifyPropertyChanged机制更适合我的需求,因为它允许我将GUI粘到现有的业务逻辑框架上,而不需要复制状态。我使用的框架有自己的观察者模式,很容易将一个级别的通知转发到下一个级别。我有一个简单的类,它实现了来自业务逻辑框架的观察者接口和INotifyPropertyChanged接口。

使用DP,您不能自己定义存储状态的后端。我将不得不让。net缓存我所绑定的每个状态项的副本。这似乎是一个不必要的开销-我的状态是大而复杂的。

因此,在这里我发现INotifyPropertyChanged更适合将属性从业务逻辑公开到GUI。

也就是说,我需要一个自定义GUI小部件来公开一个属性,并对该属性进行更改以影响其他GUI小部件DP证明了简单的解决方案。

所以我发现DP对于GUI到GUI的通知很有用。

根据WPF性能指南,DependencyObjects肯定比实现INotifyPropertyChanged的POCOs性能更好:

http://msdn.microsoft.com/en-us/library/bb613546.aspx