Model-View-ViewModel是WPF中使用的最佳模式吗?有没有缺点?
答案 0 :(得分:22)
这是一篇关于advantages and disadvantages of MVVM的好短文博客,直接来自John Gossman本人。
他的主要缺点是:
“对于简单的用户界面,MV-VM可能过度。在较大的情况下,为了获得适当的通用性,可能很难预先设计ViewModel。所有奇迹的数据绑定都是声明性的,更难的调试比你设置断点的好的命令性东西“
答案 1 :(得分:7)
为了构建我们的应用程序,我们从MVVM开始,但是在遇到很多问题之后我们放弃了MVVM,因为以下原因将确定哪些不使用MVVM。
继承问题
我们在.NET中编程,我们使用C#,最好我们确实需要继承。 C#不支持多类继承,因此我们不能使用具有部分在UI和逻辑中重用的逻辑的抽象类。
大多数时候我们都很困惑,如何设计View Models以便我们可以继承和控制逻辑。
如果我们继承View,我们不能同时继承ViewModel,如果我们继承ViewModel那么我们就不能同时继承View。相反,我们必须使用非常复杂的泛型,并且在Prism和Unity等工具的帮助下我们可以实现,但它不值得花时间。
ViewModel to ViewModel Binding
大多数时候,业务逻辑不像A = B + C这样简单,UI和UI上的响应很重要。但是我们可以将UI的可视属性绑定到View Model的数据属性,但问题是如何将一个视图模型实际绑定到另一个视图模型,如果它们通过共享控件的两个绑定,那么我们不知道将执行什么第一
ViewModel不是CodeBehind的简单替代
假设ViewModel是CodeBehind文件的简单替换。但在制作我们的应用程序时,对继承的限制告诉我们,因为WPF / Silverlight支持可以完全将UI与逻辑分离的UI样式,我们只是在ViewModel中分离业务逻辑。
ViewModel中的重复代码
我们最终意识到我们只是在每个View和每个ViewModel中编写相同的代码模式,这会改变一个巨大的痛苦,而且维护也是一种痛苦。 MVVM更适合于测试驱动开发,但在编写可扩展组件时,它们不是最佳候选者。
WPF / Silverlight已经允许您非常好地分离代码和UI,我们现在确实设计了非常简单的类层次结构,它执行业务逻辑并为我们提供所需的一切。我们现在创建所有基于ICommand的命令属性作为我们的类的依赖属性,我们在UserControl和模板化控件中绑定。
CodeBehind中的ICommand或ResourceDictionary中的模板和样式为我们提供了几乎所有可以通过MVVM获得的好处。
答案 2 :(得分:6)
这是一个很好的模式,坦率地说是WPF少数刷新的UI模式之一。我的意思是,许多人理解并采用了它。因此,获得帮助和信息相对容易。
答案 3 :(得分:4)
是的,对于小型世界风格的应用来说,这是一种过度杀伤力。
答案 4 :(得分:1)
不同的模式有不同的优势。人们倾向于将模式与实施混淆。如何安排或访问业务逻辑会影响哪种模式对于给定应用程序更自然。因此,虽然这个问题询问WPF,但在任何框架中阅读有关三次用于暗示同一屏幕的三种模式可能会有所帮助。
下面是一篇java文章的链接,该文章将MVVM(“表示模型”)与MVP(“被动视图”)和混合实现MVVMP / MVC(“监督控制器”)进行比较。我认为这与这个问题有关,因为它有一个部分可以比较模式。
Implementing event-driven GUI patterns using the ZK Java AJAX framework
它指出了约翰·戈斯曼所做出的弱点,但同时也将比较强弱和弱点与两种替代模式进行比较。