【问题标题】:Is MVVM really useful?MVVM 真的有用吗?
【发布时间】:2009-07-08 22:55:41
【问题描述】:

我已经阅读了关于 MVVM 的 MSDN 文章,但我并不太相信。 如果模型已经实现了 INotifyPropertyChanged/INotifyCollectionChanged,那么 View 直接针对 Model 绑定有什么问题? 似乎额外的 ModelView 引入了一些没有太多好处的代码。 我错过了什么吗?

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    在我看到 Jason Dolinger 的 great presentation 之前,我也对 MVVM 持怀疑态度。我推荐所有刚开始使用 WPF 和 MVVM 的同事观看它。

    Jason 从一个应用程序开始 一个人会写成“传统的” 方式,按钮点击由 代码隐藏中的事件处理程序 然后更新了 UI 的其他部分。 使用 WPF 数据绑定、命令和 团结,他一点一点地改变了它 一块,在一个更易于管理, 封装的、可读的和可测试的 M-V-VM 设计。太棒了。

    为了更直接地回答您的问题,即使在您的模型已经拥有一切的情况下绑定到 ViewModel 看起来很愚蠢,您通常最终还是需要对只有 View 需要的模型进行一点调整。随着时间的推移,这些微小的变化将潜入你的模型,它们不属于它们。它会使您的模型比应有的复杂。

    当我有一个“拥有一切”的模型时,我经常做的是添加一个包含一个属性的 ViewModel,即模型。然后在我的绑定中,我只是绑定到 Model.Name、Model.Age 等。这真的不费吹灰之力。稍后,如果我只需要对 View 进行调整,我已经准备好 ViewModel 类。这也使您的代码更直观,更易于理解。你不会想知道,在这种情况下我是绑定到模型还是视图模型?它始终是 ViewModel。

    【讨论】:

    • 当我开始使用 MVVM 时,我也持怀疑态度,然后我观看了该视频,现在感觉不对我的 WPF 应用程序使用某种形式的 MVVM。阅读 Josh Smith 的 Crack.NET 源代码也有很大帮助。
    • 那个链接已经不存在了。
    【解决方案2】:

    INotifyPropertyChangedINotifyCollectionChanged 不是唯一需要考虑的方面...在许多情况下,模型公开的数据将不容易被视图使用。 ViewModel 的作用是充当模型和视图之间的适配器:以允许视图轻松绑定到它的形式公开数据,公开视图可以绑定的命令以执行操作......通常,模型不会公开 ICommands :如果公开,则模型是 WPF 特定的,如果您想在其他非 WPF 应用程序中重用,这绝不是一件好事...

    我已经使用 MVVM 几个月了,它让我的生活变得更加轻松:代码隐藏文件中不再有“意大利面条式代码”,职责分工明确,整体架构干净......

    【讨论】:

      【解决方案3】:

      我在 2 个项目中使用了 MVVM,以下是我在 ViewModel 中一直在做的一些事情:

      • 从模型转换数据(当您使用 ViewModel 时,当 UI 规范发生变化时,它会让生活更轻松,您无需更改模型/持久性代码)
      • 在模型提供的集合上实现 ICollectionView
      • 实施命令
      • 缓存(维护计算数据成本高)
      • 维护模型数据字典(用于快速查找)
      • 延迟加载(在视图使用之前不加载)
      • 管理撤消/重做
      • 数据验证 (IDataErrorInfo)

      还有很多事情要做(我忘记了)不适合模型本身,或者会使用户界面变成意大利面条。

      不要忘记,ViewModel 使您能够对在 UI 中实现时无法测试的事物进行单元测试(例如命令)。

      最后,使用 MVVM,我能够使用 ViewModel 非常轻松地构建我的应用程序的命令行版本。

      【讨论】:

        【解决方案4】:

        我在 MEF 中使用 MVVM 已有几年了,但我并不确定它到底有多大帮助。 在我们的开发中,我们不会为不同的 View 重用 ViewModel,我们也没有只允许更改 View (UI) 的设计师。

        而且很多事情都很难在 ViewModel 中实现,例如根据 ViewModel 中的更改设置光标焦点(是的,这是可能的,但会给代码增加很多混乱)。

        MVVM 的好处是将值和命令组织为绑定,而不是直接设置字段,但这可以在没有 ViewModel 的情况下完成。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 2010-11-09
          • 1970-01-01
          • 1970-01-01
          • 2013-05-18
          相关资源
          最近更新 更多