2009-10-29 109 views
31

为什么我们在处理WPF时使用MVVM或MVP?为什么MVVM以及它的核心优势是什么?

通过使用它可以带来什么额外好处?

编辑:

说实话,今天我有一个采访,我一直在问这个问题。我回答像INotifyPropertyChanged,ICommand,IValue转换器..但他不满意。从此以后我都忍了这个问题

在此先感谢

+3

我总是看着MVVM作为MVC的变体。 – 2009-10-29 16:38:58

回答

44

我会告诉你一个Jason Dolinger特别有用的video。从一个WinForms世界开始,实现任何MVX风格的模式似乎比它的价值更加麻烦,但是在使用WPF几年后,我可以诚实地说我不会考虑更少的东西。整个范例都支持开箱即用。

首先,关键的好处是能够实现'视图'和'模型'之间的真正分离。这实际上意味着,如果/当你的模型需要改变时,它可以不需要视图,反之亦然。其次,虽然你的'模型'可能包含你在'视图'中可能需要的所有数据,但是你可能想要以'模型'不支持的方式来抽象这些数据。例如,假设你的模型包含一个日期属性。在该模型中,它可以仅作为DateTime对象存在,但您的视图可能想要以完全不同的方式呈现它。如果没有'viewmodel',你必须复制'model'中的属性来支持视图或修改可能严重混淆'model'的属性。

您还可以使用'viewmodel'来聚合存在于单独的类/库中的模型的某些部分,以便为'视图'处理更流畅的界面。它很可能是非常您不希望您的代码中的数据与用户希望或希望将数据呈现给他们一样。

最重要的是,您将获得对'view'和'viewmodel'之间自动双向数据绑定的支持。

真的有额外的东西一大堆,我可以喋喋不休,但杰森说的这更好,我可以让我的建议是,观看视频。经过几天这样的工作,你会想知道如果没有它,你会怎样。

祝你好运。

+5

杰森的视频绝对是我见过/读过的MVVM的最佳介绍。源代码可以在这里找到http://blog.lab49.com/archives/2689 – 2011-10-19 03:45:11

3

烤在ICommand的和INotifyPropertyChanged的支持是两个最大的好处。使用MVVM可以很容易地连接命令并将数据插入WPF UI。事情正常。

+0

说实话,今天我接受了一次采访,我被问到了这个问题。我也回答几乎像INotifyPropertyChanged,ICommand,IValue转换器一样的东西..但他不满意。从此我提出了这个问题。 – 2009-10-29 15:21:21

5

WPF比任何其他UI框架,这MVVM将不羁没有

MVVM提供单元可测试性和良好的视野,不可知论,这使得它使用

15

这些是我的具体一件好事更好的数据绑定到MVVM

  1. 增加了 “可混合性” 的你的意见(能够使用Expression Blend的设计视图)。这样可以让有足够幸运的设计师和程序员的团队分担责任......每个人都可以独立工作。
  2. “Lookless”查看逻辑。视图与运行在其后面的代码无关,使相同的视图逻辑可以在多个视图中重用,或者可以轻松地重新构造或替换视图。分解“行为”和“风格”之间的关系。
  3. 没有重复的代码来更新视图。在代码隐藏中,您会看到很多调用“myLabel.Text = newValue”的地方。使用MVVM,您可以放心,只需设置底层属性及其所有视图副作用即可更新视图。
  4. 可测性。由于你的逻辑完全不可知你的视图(没有“myLabel.Text”引用),单元测试变得非常简单。您可以测试ViewModel的行为而不涉及其视图。这也使视图行为的测试驱动开发成为可能,使用后台代码几乎是不可能的。

其他两种模式在他们所关注的问题上实际上是分开的。你可以使用MVVM和MVP(MVC和MVC中最好的示例)。实际上,在我看来,MVP(w/a被动视图,而不是监督控制器)实际上只是MVVM的一个变体。

+2

2和4对于MVC或MVP以及MVVM都是正确的。 – 2009-10-29 16:21:33

+0

是的......我忽略了这些模式,因为它们确实解决了典型应用程序的一个稍微不同的方面。我编辑了我的答案以包含此内容。 – 2009-10-29 16:23:52

+0

+1不错和容易理解 – 2013-12-24 12:27:31

0

XAML代码绑定数据的能力以及触发器的存在将打破MVP和MVC模式。

1

我个人认为MVVM不是好处,而是希望使用WPF酷功能的人的义务。

WPF在内核中使用数据绑定构建的程度非常高,可以将UI从模型中分离出来。但是,数据绑定在WPF是技术上做的方式有点特殊,因为它绑类,如:

  • 的DependencyProperty
  • 因此INotifyPropertyChanged的
  • 的ObservableCollection

你只是不能真正使用标准.NET技术按照您的方式编写模型。例如,WPF TreeView几乎不可能使用数据绑定和模板使用w/o。例如,您无法像使用Winforms中的通用模型那样填充它。它使用ObservableCollection将必须绑定到分层模型以表示节点的子节点。假设V表示XAML代码,它是代码隐藏的对象(所以它与WPF作为一项技术绑定在一起),假设M代表您的模型(因此它不依赖于WPF UI技术)。

好吧,你永远不会有这个工作正常WPF下,只有这些V & M.

必须添加两个之间的事情。一些WPF兼容并理解你的模型。说的是DependencyProperty,ObservableCollection和INotifyPropertyChanged。这就是所谓的虚拟机。作为一个方面说明,MVVM的另一种选择是构建一个M(W/O VM管道)组合,其中M是WPF兼容的,但仍具有合理的UI独立性。从历史上看,ObservableCollection位于WindowsBase.dll程序集(随WPF一起提供)中,因此将一个通用模型绑定到与UI技术绑定的东西看起来很奇怪。因为它已经被移回到System.dll。即使那样,有时很难保持一个纯虚拟机模型没有调整M专门为WPF ...

+0

是同意你说的大部分内容,但是WPF的数据绑定在代码背后以及虚拟机方面都很出色。 OC,INPC和DP在没有MVVM的情况下工作得很好。 WPF的真正威力在于数据绑定而不是MVVM。我们建立了MVVM和代码,两者都具有出色的数据绑定。 – 2017-07-27 12:56:25

相关问题