【问题标题】:What makes MVVM uniquely suited to WPF?是什么让 MVVM 特别适合 WPF?
【发布时间】:2010-12-04 00:39:56
【问题描述】:

Model-View-ViewModel 在 WPF 和 Silverlight 中非常受欢迎。我在最近的项目中一直使用它,并且是一个非常忠实的粉丝。

我知道这是对MVP 的改进。但是,我想知道 WPF(和 Silverlight)的哪些独特特性允许 MVVM 工作,并阻止(或至少使困难)这种模式使用其他框架或技术工作。

我知道 MVVM 非常依赖 WPF 中强大的数据绑定技术。这是许多文章和博客似乎提到的一个功能,它是 WPF 的关键,它提供了将 View 与 ViewModel 强分离的方法。但是,在其他 UI 框架中,many forms 中存在数据绑定。甚至还有像 Truss 这样的项目,为 .NET 中的 POCO 提供 WPF 样式的数据绑定。

除了数据绑定之外,还有哪些功能使 WPF 和 Silverlight 独一无二地适用于 Model-View-ViewModel?

【问题讨论】:

    标签: .net wpf design-patterns mvvm


    【解决方案1】:

    我认为命令支持 (ICommand) 以及强大的数据绑定功能使其适用于 WPF 和 Silverlight。

    【讨论】:

      【解决方案2】:

      简而言之:就是数据绑定。

      根据Data Binding Overview from MSDN

      如果绑定具有正确的设置并且数据提供了适当的通知,那么当数据更改其值时,绑定到数据的元素会自动反映更改。数据绑定也可能意味着如果元素中数据的外部表示发生变化,则可以自动更新底层数据以反映变化。例如,如果用户编辑 TextBox 元素中的值,则基础数据值会自动更新以反映该更改。

      如果您正确设置了 XAML,您只需使用视图模型与您的用户界面进行交互。 WPF 负责在视图模型更改时更新 UI,并在 UI 更改时更新视图模型(例如用户输入)。

      【讨论】:

      • mmm - 我不觉得数据绑定本身就足够了,尽管这是主要吹捧的功能。如果只是关于数据绑定,Truss 之类的东西将允许 MVVM 用于任何 .NET 技术......(我同意它是一个重要的构建块,而不是唯一的一个)。我希望有其他关键的非数据绑定功能。
      【解决方案3】:

      DataBinding、命令、控件模板和 XAML。

      如果没有其中之一,MVVM 会更难,如果不是不可能的话。以 ASP.net 为例,它有 ASPX 部分(为了示例,它相当于 XAML),它有数据绑定,但它没有命令或控制模板,所以 MVVM 在那里是不可能的。在 WinForms 中,我们有数据绑定,仅此而已,所以也不可能。

      【讨论】:

      • 为什么你觉得 MVVM 需要 XAML?
      • 出于 2 个原因,DataBinding(在 MVVM 中是通过 XAML 完成的)和 ControlTemplates。如果没有后者,编辑/创建我们自己的控件将是代码绑定的,这使得 MVVM 在使用用户创建的控件时更加困难。
      • 数据绑定不必通过 XAML 完成,有些人更喜欢将其从 XAML 中分离出来。虽然创建代码 UI 比 XAML 更难,但它是可能的,并且不会影响 MVVM 的使用。而且我认为数据模板与 MVVM 比控制模板更相关。
      • 它不是必须的,但 MVVM 的重点是通过 XAML,因此实际代码可以独立于它 [XAML] 运行,例如进行单元测试。最好不要在代码端进行任何绑定,也不要使用事件(改用命令),这样您的控件就不会绑定到代码中的事件。
      【解决方案4】:

      我已经在 MFC、WinForms 甚至 MATLAB 中实现了 MVVM 的表亲模式Model-View-Presenter。我同意原帖:WPF 非常好地促进了数据绑定,但您可以在其他平台上使用这些概念(尽管代码更多)。

      阅读John Grossman's 博客,真正的区别在于用户界面将使用与业务逻辑不同的语言编写。理想的情况似乎是 UI 开发由“设计师”而不是程序员来执行。

      这是 WPF 独一无二的领域——我不知道有任何其他开发环境可以实现这一理想。

      (请注意,我从来没有在一个足够大的团队中工作以保证专门的 UI 设计师。我不能说这个理想是否真的可以实现)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-06
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        相关资源
        最近更新 更多