【问题标题】:One sentence explanation to MVVM in WPF?WPF中对MVVM的一句话解释?
【发布时间】:2010-11-12 07:04:18
【问题描述】:

我听说它是​​构建 WPF UI 的下一个最佳选择,但所有现有的 示例有几十行代码 - 我可以得到一个 Hello World 对于 MVVM,它毫不含糊地解释了它的全部内容? 我对 C#/.net 也很陌生,所以也许可以指点我一些 也可以提供帮助的资源?

非常感谢!

【问题讨论】:

    标签: wpf design-patterns mvvm user-interface


    【解决方案1】:

    一句话解释:

    MVVM 是对深受喜爱的 Model-View-Presenter (MVP) 模式的重新构想,该模式旨在与 WPF 提供的数据绑定工具一起工作,从而将应用程序逻辑与 UI 设计分离。

    更长,更有用的解释:

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

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

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

    除此之外,您还可以对 ViewModel 进行分层,这是应用程序逻辑所在的位置,它通知视图模型的更改并确保数据一致性。通过实现 INotifyPropertyChanged 接口,WPF 免费提供了 ViewModel 和视图之间的两种数据绑定方式:

    public class MessageViewModel : INotifyPropertyChanged
    {
         private MessageModel _model;
    
         public string Message
         {
              get { return _model.Message; }
              set
              {
                  if (_model.Message != value)
                  {
                      _model.Message = value;
                      OnPropertyChanged("Message");
                  }
              }
         }
    }
    

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

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

    您进行所有这些工作的原因是模型非常轻量级,并且很容易跨域边界传递。从 Web 服务发送或接收数据或将其映射到数据库表很简单。另一方面,ViewModel 很复杂,但几乎没有依赖关系——它不关心模型从哪里获取数据,只关心它在那里并且根本没有视图的概念,这使得它非常可测试(您的应用程序的逻辑不依赖于 UI 进行测试)。最后,xaml 被很好地划分,可以交给不需要了解应用程序逻辑的设计人员,只需要 ViewModel 以特定名称呈现特定数据。这种封装使得在大型项目中定义角色变得非常容易,或者将有限的 UI 放在一起以测试逻辑,同时完善真实的逻辑。

    【讨论】:

    • 很棒的答案。感谢您对复杂主题的简单解释
    • @MartinHarris 你说模型是从网络服务或数据库中获得的?我们应该把那个逻辑代码放在哪里?在视图模型中?
    【解决方案2】:

    MVVM 是一种明星粉丝关系。粉丝认识明星,明星不认识粉丝。粉丝非常喜欢他的明星,如果明星改变自己(我是指他的穿衣风格),粉丝也会相应地改变自己。

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

    【讨论】:

    • 漂亮的解释..像我这样的初学者容易理解
    【解决方案3】:

    一句话?来了。

    MVVM 是一种 UI 隔离模式,其中 Xaml(视图)绑定到外观(视图模型),允许您的程序(模型)的核心避免 UI 问题泄漏到层。

    【讨论】:

    • +1 哈哈。经典的软件开发者。你给了用户他所要求的东西,但事实证明这对他没有任何好处,而且这可能不是他真正想要的。 (虽然让我发笑)=:)
    • 为了理解 VM 是什么——模型的外观,我必须浏览多少定义和文章。对于已经了解 MVC 的人来说,这是迄今为止最简单的解释。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          MVVM 模式是当 UI 与一个对 xaml 友好的中间对象进行交互以获取对 xaml 不友好的实际数据时。

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

              改进的答案:

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

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

              【讨论】:

                【解决方案10】:

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

                【讨论】:

                  【解决方案11】:

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

                  (这里只是半开玩笑)

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-12-12
                    • 2010-12-20
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-09-05
                    • 2020-07-27
                    相关资源
                    最近更新 更多