我是WPF / MVVM的新手并试图理解这种模式。我正在探索这个MVVM应用程序http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
作者创建了Customer
类,该类存储在Model
文件夹和CustomerRepository
类中,存储在DataAccess
文件夹中
CustomerRepository
包含'做东西'的方法,例如static List<Customer> LoadCustomers(string customerDataFile)
I.e。我们不能说CustomerRepository
是纯模型文件,它也是一种实用文件。
从另一只手CustomerRepository
存储重要数据readonly List<Customer> _customers;
,我们知道我们应该在模型中存储此类数据!
好吧我会说CustomerRepository
混合了东西 - 它是一个包含一些实用方法的模型文件。
问题是CustomerRepository
实例传递给ViewModel public AllCustomersViewModel(CustomerRepository customerRepository)
。现在viewModel包含它不应该包含的东西,特别是它可以强制CustomerRepository
重新加载东西等。
在我看来这是MVVM模式,我认为 ViewModel应该只包含对模型文件的引用所有实用程序类和方法操作模型文件应该在其他地方
我是对还是错? 是否可以将在模型上提供某些服务的类(可以重新加载/重新刷新模型等)传递给ViewModel? I.e。哪里应该是所谓的service layer
,是否可以在ViewModel中使用它?
答案 0 :(得分:4)
您认为“ViewModel应该只包含对模型文件的引用”是错误的。
ViewModel可以引用它需要的任何内容,只要它不是视图。
将服务注入ViewModel是很常见的。
答案 1 :(得分:1)
好问题。我相信大多数MVVM应用程序你会发现相同的。实际上ViewModel知道与服务,存储库的通信,直接或不直接取决于应用程序设计,所以这很好。此外,VM应该能够强制重新加载数据等,以反映UI更改所请求的内容。 ViewModel通过命令ViewModel与命令和绑定分离,能够处理任何特定命令,然后从服务请求/更新新数据,无论如何。
答案 2 :(得分:1)
AFAIK,MVVM模式有两种广泛的处理方式。
第一个,您似乎更熟悉,包括4个组件:视图,模型,ViewModel和Controller。在这里,ViewModel仅包含UI逻辑,并向Controller公开事件,用于ViewModel和Model之间的同步。
本文中使用的第二个,只是将ViewModel和Controller合并到ViewModel中。 BTW,Martin Fowler描述了这个案例:http://martinfowler.com/eaaDev/PresentationModel.html
选择取决于我所看到的个人偏好。