WinForms的MVVM模式

35

我认为标题中有拼写错误。 - crauscher
WinForms 中的数据绑定有一半的时间可以正常工作,而另一半时间则会默默地失败。 - micahhoover
@micahhoover,在WPF中则相反。 - StayOnTarget
5个回答

22

我认为这里有两个答案......一个是"我应该吗?"的答案, 另一个是“我能吗?”的答案。

对于"我能吗",这完全是可能的。MVVM只需要一个可以绑定到视图模型的视图。由于WinForms支持绑定,因此这确实是可能的。在MVVM世界中,您可能需要编写一些代码使绑定更加有用,但至少从理论上讲,它是可能的。如果运作良好,好处将是相当大的。你可以确保你的WinForms "View"除了创建可视对象和绑定它们(在代码中,而不是像XAML中那样声明)之外没有任何UI行为。WinForms对象非常难以测试,而ViewModels很容易测试。

至于你真正的问题:“我应该吗?”,那就更多地成为一个项目层面的决定。你的目标是什么?如果您要使某些相当复杂的UI逻辑可测试,则可以至少考虑一下。幸运的是,还有其他模式(例如Model-View-Presenter),这些模式具有更多的社区支持,也会让您编写可测试的“presenter”类。与Presenter相比,我发现ViewModels显着更容易编写单元测试,但我认为这是个人喜好。

仅作为一种旁白,MVVM模式主要是"Presenter Model"模式的另一个名称。您可以查看是否有人在WinForms UI上使用"Presenter Model"取得了成功。

祝好运!


9
Model-View-ViewModel(MVVM)模式是一种设计模式。按照定义,设计模式展示了面向对象世界中的一种常见解决方案,这种解决方案可以应用于各种平台(如WPF、WinForms、Java Swing等)。我同意MVVM最好与WPF一起使用,因为它利用了强大的绑定功能。然而,Windows Forms也支持数据绑定。 WAF Windows Forms Adapter 展示了如何在Windows Forms应用程序中应用MVVM模式。

-1

MVVM特别适用于WPF和Silverlight中的标记+代码和无外观模型。我不建议在WinForms应用程序中使用它,因为我认为这会导致过度杀伤。我在WinForms应用程序中没有看到任何MVP之上的优点。然而在WPF和Silverlight中,MVVM始终比MVP更受欢迎。

在网上了解MVVM是什么以及为什么会出现。这应该进一步澄清问题。


-1

我不相信MVVM可以在winforms中完成(至少不是没有大量的黑客攻击)。MVVM将视图(您的表单)与视图模型(您的逻辑)分开。

它可以在WPF中完成的原因是因为 WPF允许通过XAML数据绑定松散耦合视图和视图模型。这使得ViewModel不需要知道任何关于视图的信息也能够正常工作。这是一篇好的文章介绍了MVVM的基础知识,我相信它会解决很多问题。


17
但是 WinForms 支持绑定...虽然它的绑定机制不像 XAML 绑定那样优雅,但支持是存在的,我曾经广泛地使用过。WinForms 的绑定机制还“允许视图与视图模型之间的松耦合”。我并不是在说 MVVM 模式比其他模式(如 MVP)更适合 WinForms,但说它做不到并不太公正。 - Brian Genisio
看到我的回答,你可能会认为这是黑客行为! - PeteH

-1

MVVM是专门为WPF创建的,以利用WPF的绑定和命令等功能。Windows Forms没有这些功能(*), 因此尝试将MVVM模式应用于Windows Forms应用程序并不真正有意义...您应该使用MVC或MVP。

(*) 它实际上具有一些基本的数据绑定支持,但不如WPF强大...


10
我不是那个给负评的人,但我对“MVVM是为WPF特别创建”的说法有异议。MVVM实际上只是“Presentation Model”的另一个名称,比MVVM命名更久远。而且,WinForms也能进行数据绑定并非不可行,只是使用了不同的机制。 - Brian Genisio
3
@BrianGenisio,MVVM确实是PM的一种变体,但并不完全相同。 MVVM有一些特定于WPF的方面,在PM中不存在(例如命令)。我知道WinForms支持数据绑定,我在我的回答中也提到了......但与WPF相比,WinForms的数据绑定机制非常有限。 - Thomas Levesque
在 http://mvvmfx.codeplex.com/ 上,您可以找到一些有用的 MVVM 工具,适用于 Windows Forms: 1)一个数据绑定库,其中包含转换器,还可以将操作绑定到属性更改 2)一个命令绑定库,可以将操作绑定到任何 UI 组件的任何输入事件 - Tiago Freitas Leal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接