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

35 wpf user-interface design-patterns mvvm

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

非常感激!

Mar*_*ris 74

一句话解释:

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

更长,更有用的解释:

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

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

public class MessageModel
{
    public string Message { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

最重要的是,您将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");
              }
          }
     }
}
Run Code Online (Sandbox Code Playgroud)

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

<Canvas>
     <TextBox Text={"Binding Message"} />
</Canvas>
Run Code Online (Sandbox Code Playgroud)

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

  • 很棒的答案.感谢您对可能是一个复杂主题的简单解释 (5认同)

Abd*_*med 39

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

现在将"star"替换为"ViewModel",将"fan"替换为"View"并再次阅读.


Bal*_*all 14

一个句子?开始.

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

  • +1哈哈.经典的软件开发人员.你给用户提供了他所要求的,但事实证明它根本没有让他受益,而这可能不是他真正想要的.(虽然让我笑了)= :) (23认同)

bil*_*llb 8

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


Sim*_*ens 4

这个网站有一个很棒的图表来解释它。

基本上,您有 3 个组件:
1)模型- 应用程序的数据模型。这是非常标准的,与任何 MVP 或 MVC 应用程序相同。
2)视图- 定义应用程序的视图/布局的 XAML。
3)视图模型- 因为 WPF 要求视图以某种方式附加到事物上(例如要求集合实现 INotifyCollectionChanged 之类的东西),所以它通常要求您对数据进行一些修改,以使其成为适合视图的形式显示。这是视图模型编码的地方。它将数据打包到视图可以轻松显示的视图模型中。这就是您的视图 XAML 将绑定到的内容。它必须响应来自模型层的事件并更新自身。

(然后您的控制器挂在侧面某处 - 最好使用 WPF 命令 - 并对模型进行更改,这会触发事件来更新视图模型)