在WPF中对MVVM的一句话解释?

时间:2009-07-20 12:02:15

标签: wpf design-patterns mvvm user-interface

我听说它是​​构建WPF UI的下一个最好的东西,但是所有现有的 示例有几十行代码 - 我可以获得一个Hello World 对于MVVM来说,毫不含糊地解释了它的全部内容? 我对C#/ .net也很新,所以也许请点我一些 资源也有帮助呢?

非常感谢!

11 个答案:

答案 0 :(得分:73)

一句话解释:

MVVM是对备受好评的Model-View-Presenter(MVP)模式的重新构想,该模式旨在与WPF提供的数据绑定工具一起使用,以将应用程序逻辑与UI设计分开。

更长,更有用的解释:

MVVM的基本概念是将WPF应用程序分解为单独的组件,每个组件在获取屏幕信息的过程中都有一个责任。

首先你有模特。这是一个功能非常有限的类,通常从某些外部源(如数据库或Web服务)填充。例如:

public class MessageModel
{
    public string Message { get; set; }
}

除此之外,您将ViewModel分层,这是应用程序逻辑所在的位置,它会通知视图模型的更改并确保数据的一致性。通过实现INotifyPropertyChanged接口,ViewModel和视图之间的双向数据绑定由WPF免费提供:

public class MessageViewModel : INotifyPropertyChanged
{
     private MessageModel _model;

     public string Message
     {
          get { return _model.Message; }
          set
          {
              if (_model.Message != value)
              {
                  _model.Message = value;
                  OnPropertyChanged("Message");
              }
          }
     }
}

最后你有了View。这是一个xaml文件,描述了用于在ViewModel中显示和编辑数据的控件的布局:

<Canvas>
     <TextBox Text={"Binding Message"} />
</Canvas>

您完成所有这些工作的原因是模型非常轻量级,并且很容易跨域边界传递。从Web服务发送或接收它或将其映射到数据库表很简单。另一方面,ViewModel很复杂,但依赖性很少 - 它不关心模型从何处获取数据,只关注它的存在而且它根本没有视图的概念,这使得它非常可测试(您的应用程序的逻辑不依赖于UI来测试)。最后,xaml被很好地区分开来,可以交给一个设计师,他不需要知道应用程序的逻辑,只有ViewModel会以某些名称呈现某些数据。这种封装使得在大型项目中定义角色变得非常容易,或者在真实的项目被抛光的过程中组合有限的UI来测试逻辑。

答案 1 :(得分:38)

MVVM是一个明星粉丝的关系。粉丝知道明星,但明星不知道粉丝。粉丝非常喜欢他的明星,如果明星改变自己(我的意思是他的穿衣风格),那么粉丝会相应地改变自己。

现在将“star”替换为“ViewModel”,将“fan”替换为“View”并再次阅读。

答案 2 :(得分:14)

一句话?到此为止。

MVVM是一种UI隔离模式,其中Xaml(View)绑定到一个Facade(View Model),允许您的程序(Model)的内容避免让UI关注漏掉一层。

答案 3 :(得分:8)

帮助我最好地理解它的简单陈述是“我可以在没有用户界面的情况下对我的业务逻辑进行单元测试吗?”我认为这应该是您在使用MVVM概念学习和设计时提出的问题。

答案 4 :(得分:4)

This site有一个很好的图表可以解释它。

基本上你有3个组成部分:
1)模型 - 应用程序的数据模型。这是非常标准的,与任何MVP或MVC应用程序相同 2)查看 - 定义应用视图/布局的XAML 3)查看模型 - 因为WPF要求视图以某种方式附加到事物上(例如要求集合实现INotifyCollectionChanged和类似的东西),它通常需要您按摩数据一点点才能获得它以适合视图显示的形式。这是视图模型编码的位置。它将数据打包到视图可以轻松显示的视图模型中。这是您的视图XAML将绑定到的。它必须响应模型层中的事件并自行更新。

(然后你的控制器挂在某处 - 理想情况下使用WPF命令 - 并对模型进行更改,从而触发事件以更新视图模型)

答案 5 :(得分:1)

前端(视图)和后端(模态)使用公共中介(视图模式)进行通信(来回)的模式。

答案 6 :(得分:1)

MVVM模式是指UI与xaml友好的中间对象接口,以获取对您不熟悉的xaml实际数据。

答案 7 :(得分:0)

我会说:“用于分离用户界面与其逻辑之间关系的表示模式”

答案 8 :(得分:0)

改进的答案:

MVVM就是未来;您希望将应用程序逻辑与框架分离,以便框架可以发展,并且您的应用程序可能不必更改,或者您的应用程序可以发展,您不必担心更改实际的UI方面。< / p>

实际上,MVVM是一种已经存在一段时间的模式的改进。我记得当我在MFC工作时不断改进模式。这样做至少有两个原因。 MFC或&lt;&gt;相当复杂,将MFC结构与应用程序逻辑混合使应用程序变得脆弱。示例:如果支持列表/选择器内容的逻辑与操作列表/选择器本身的逻辑相结合,则用组合框(或现代术语中的选择器)替换列表框要困难得多。

答案 9 :(得分:0)

一些非常好的单句(或接近它)的解释已经存在。我只想补充说,如果你已经超过了基础级别,并且想要一个如何在具有菜单,工具栏,选项对话框,对接工具窗口等的真实应用程序中使用MVVM的示例。 ,看看SoapBox Coredemo using SoapBox Core。它是开源的,因此您可以获得很多想法。

答案 10 :(得分:0)

因为您无法将数据绑定到您自己的代码隐藏

(这里只是半开玩笑)