MVVM,我应该把逻辑放在模型或视图模型中(控制器)

dem*_*xSH 2 silverlight model-view-controller mvvm

我是MVVM的新手,现在在Silverlight项目上做一些MVVM重构工作,假设它是一本书购物应用程序.

View是一个书籍列表,我将书籍的标题绑定到ViewModel.所以我public string Title { get; set; }在ViewModel中也有一个public string Title { get; set; }模型(我是对的吗?)

现在我想放一个事件处理程序来更新书名,我应该把事件处理程序放在ViewModel或Model中吗?什么是模型用于?

Gon*_*ing 7

在我看来"两者都不..."将控制器类添加到MVVM的混合中.

将控制器代码放在视图模型中的问题在于使它们难以独立测试.在许多方面,我认为这与代码背后一样糟糕.

在我看来,每个人都认为MVVM没有控制器,因为他们忽略了C. MVVM实际上是MVC的变种"只是添加了ViewModels".

也许它应该被称为MVCVM而不是?

ViewModels仅用于从视图中卸载"GUI"代码并包含任何用于绑定的数据.ViewModels不应该进行任何处理.一个很好的测试是,您的ViewModel可以通过自动化单元测试进行测试,并且不依赖于数据源等.他们应该不知道数据实际来自哪里(或者谁在显示它).

虽然可以忽略/避免,但Controller应负责决定显示哪些数据模型以及在哪些视图中显示.ViewModel是Models(MVVM中的M)和Views之间的桥梁.这允许更简单的"分离"XAML创作.

我们在所有最近项目中成功使用的模式是仅在模块中注册控制器,并在启动时初始化它们.控制器非常轻薄,是唯一需要在应用程序监听或发送消息的过程中闲逛的东西.在他们的初始化方法中,他们然后注册他们需要拥有的任何东西(视图和视图模型等).这种轻量级逻辑内存模式也可以实现更轻薄的应用程序(例如,WP7更好).

我们遵循的基本规则是:

  • 控制器根据事件做出决策
  • 控制器获取数据并将其放入适当的View Model属性中
  • 控制器设置View Models的ICommand属性以拦截事件
  • 控制器显示视图(如果不在其他地方暗示)
  • 视图模型是"愚蠢的".他们持有绑定数据,没有别的
  • 视图知道它们显示某种形状的数据,但不知道它来自何处

最后两点是你永远不应该打破的,或者关注点的分离会消失.