我应该传递什么参数给我的ViewModel'

本文关键字:ViewModel 我的 什么 参数 我应该 | 更新日期: 2023-09-27 18:15:47

我是WPF/MVVM的新手,试图理解这种模式。我正在研究这个MVVM应用程序http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

作者创建的Customer类存储在Model文件夹中,CustomerRepository类存储在DataAccess文件夹中

CustomerRepository包含"做东西"的方法,例如static List<Customer> LoadCustomers(string customerDataFile),即我们不能说CustomerRepository是纯模型文件,它也是一种实用程序文件。

从另一方面CustomerRepository存储了重要的数据readonly List<Customer> _customers;,我们知道我们应该将这种数据存储在模型中!

嗯,我会说CustomerRepository是混合的东西-它是一个模型文件,其中包含一些实用程序方法。

问题是CustomerRepository实例被传递给ViewModel public AllCustomersViewModel(CustomerRepository customerRepository)。现在viewModel包含了一些它不应该包含的东西,特别是它可以强制CustomerRepository重新加载东西等。

在我看来,这是反对MVVM模式,我认为ViewModel应该只包含对模型文件的引用所有的实用程序类和方法来操作模型文件应该在其他地方

我是对还是错?是否可以将提供模型上一些服务的类(可以重新加载/刷新模型等)传递给ViewModel?即在哪里应该是所谓的service layer,是可以有它在ViewModel?

我应该传递什么参数给我的ViewModel'

您认为"ViewModel应该只包含对模型文件的引用"是错误的。

ViewModel可以引用任何它需要的东西,只要它不是一个视图。

将服务注入ViewModel是很常见的。

当然,MVVM模式有两种普遍的处理方法。

第一个,你似乎更熟悉,包括4个组件:视图,模型,ViewModel和控制器。在这里,ViewModel只包含UI逻辑,并将事件暴露给控制器,控制器用于ViewModel和Model之间的同步。

本文中使用的第二个方法只是将ViewModel和Controller合并到ViewModel中。顺便说一句,Martin Fowler描述了这种情况:http://martinfowler.com/eaaDev/PresentationModel.html

在我看来,选择取决于个人喜好

问得好。我相信在大多数MVVM应用程序中,您会发现相同的情况。实际上ViewModel知道与服务、存储库的通信,直接或不直接取决于应用程序设计,所以这很好。此外,VM应该能够强制重新加载数据等,以反映UI更改请求。ViewModel通过命令和绑定与View解耦,通过暴露命令,ViewModel能够处理任何特定的命令,然后从服务请求/更新新数据,等等。