为了建立我们的应用程序,我们开始使用MVVM,但是由于以下原因我们放弃了MVVM:
继承问题
我们使用C#编程,并且希望使用继承。C#不支持多重类继承,因此我们无法拥有包含部分在UI中重复使用逻辑的抽象类。
大多数情况下,我们都会感到困惑,如何设计视图模型以便我们可以继承并控制逻辑。
如果我们继承View,则同时无法继承ViewModel;如果我们继承ViewModel,则同时无法继承View。相反,我们必须使用非常复杂的泛型,并借助像Prism和Unity这样的工具来实现,但这不值得花费时间。
ViewModel到ViewModel绑定
大多数时候,业务逻辑并不像A = B + C那么简单,UI和UI上的响应起着重要作用。然而,我们可以将UI的可视属性绑定到视图模型的数据属性,但问题在于如何将一个视图模型实际绑定到另一个视图模型上,如果它们通过共享控件的两个绑定,则我们无法确定将首先执行什么。
ViewModel不是代码后台的简单替代
人们认为ViewModel是代码后台文件的简单替代。但是,在制作我们的应用程序时,继承约束告诉我们,正如WPF / Silverlight支持完全将UI与逻辑分离的UI样式一样,我们只是在ViewModel中过度分离业务逻辑。
ViewModel中的重复代码
我们最终意识到,在每个视图和每个视图模型中,我们只是编写相同的代码模式,更改这些代码模式变得非常麻烦,维护也很麻烦。MVVM更适合测试驱动开发,但是当涉及编写可扩展组件时,它们不是最佳选择。
WPF / Silverlight已经非常好地将代码和UI分离,我们现在设计了非常简单的类层次结构,执行业务逻辑并为我们提供所需的一切。我们现在将所有基于ICommand的命令属性创建为我们类的依赖属性,在UserControl和Templated Control中进行绑定。
CodeBehind中的ICommand或ResourceDictionary中的Template and Styles为我们提供了几乎可以获得的所有MVVM优点。