WPF项目中MVVM和MVC之间的主要区别是什么?

时间:2015-06-26 18:01:25

标签: c# wpf xaml model-view-controller mvvm

我希望您了解MVVM项目和MVC项目之间的主要区别。我知道MVVM和MVC的基本原理,但我想在技术上更多地了解它们在WPF项目中的区别。

3 个答案:

答案 0 :(得分:2)

我看到的最重要的区别是强调使用MVVM“切换部件”的能力。这个想法是Model不知道ModelView,同样ModelView也不知道View。因此,如果您完全重新设计View,ModelView将不受影响。

使用MVC,您的每个组件间引用可能都是双向的(模型将了解Controller,反之亦然)。这有助于组件的互操作性,但使任何一个组件难以独立于其他组件存在。如果您想要更改视图,则可能必须对其他两个组件进行比例更改。

使用MVVM,模型应该能够只使用数据来处理它的事情,而不管其存在之外的任何人是否关心它的作用。 ModelView应该能够利用Model正在做的所有很酷的东西,并使数据可以被外部资源消耗,但应该忽略最终用户将如何消费。最后,View了解ModelView,并且可以从中获取为其用户定制体验所需的一切。

两大卖点是你可以无缝地切换视图(几乎)。 ModelView对View一无所知,因此它无论如何运行。 View如何插入ModelView完全取决于View。另一点是您可以相对隔离地对Model和ModelView进行单元测试。您无需初始化View组件即可运行它。

虽然长而且有点密集,但这是一个很好的阅读:https://msdn.microsoft.com/en-us/magazine/dd419663.aspx

答案 1 :(得分:1)

它们都是架构模式,旧版本是MVC,然后是MVP(Model View Presenter),MVP继承MVVM。

如果在WPF应用程序中实现MVVM,则代码应该更加分离,因为视图逻辑应该在viewmodel类中实现,该类可以被重新接收,因为它独立于视图。由于WPF的功能,您可以通过视图模型控制视图的行为,您可以在其中公开可以在某些内容发生更改时通知视图的可观察数据(但是视图模型不知道什么是数据源) ),以及执行操作的命令,这些操作告诉视图如何响应用户交互(但视图模型对视图一无所知)。

在其他类型的应用程序中,例如Asp.Net Web窗体或Windows窗体,我们实现此目的的唯一方法是编写"代码",我们控制用户交互并放置表示逻辑,这通常是使用MVP和MVC,这样你就拥有了更多依赖于UI的代码,简单的UI更改可能会破坏更多的代码。

答案 2 :(得分:1)

这里的其他答案谈论MVVM的一些好处,但我觉得他们没有回答这个问题。我相信你会问一个关于MVC和MVVM之间差异的哲学问题。

根据我的经验,MVC中的Controller负责触发View和Model上的状态更改。例如,您的View可能具有以下功能:

public void SetupListBox(List<string> items) {...}

或者更为单一的东西,一次提供大量信息:

public void SetupForm(string name, List<string> listItems, string selectedItem) {...}

Controller将显式调用此类方法来触发状态更改,View(在本例中)将在方法中更改其状态。

使用MVVM,ViewModel公开公开视图的状态,通常是在粒度级别:

public string Name { get {...} set {...} }
public List<string> ListItems { get {...} set {...} }
public string SelectedItem { get {...} set {...} }

ViewModel还负责通知View发生了相关的状态更改。 WPF使用INotifyPropertyChanged。

考虑它的一种方法是ViewModel抽象地表示应该在View中出现的状态。该状态是否实际反映在视图中取决于您实施架构的程度。

请注意,MVC和MVVM不是竞争模式。使用MVVM,您仍然需要逻辑来驱动状态更改。关键的区别在于该州的生活方式。将所有状态更改驱动逻辑直接放在ViewModel中通常是最容易的。较大的应用程序可能需要MVVMC架构。