【发布时间】:2016-07-25 02:24:16
【问题描述】:
许多人建议 WPF MVVM 开发人员不要将模型实例从 ViewModel 暴露给 View。要显示来自 Model 实例集合的信息,请将所有单个项目包装到 ViewModel 实例中,并将 ViewModel 集合公开给 View。
但是,在我看来,使用 MVVM Light 有两种 ViewModel:
- 与视图具有一对一关系的视图模型(例如
MainWindowViewModel或CustomerEditorViewModel)。假设只有一个MainWindow,那么就只有一个MainWindowViewModel。 - 与模型实例具有一对一关系的视图模型(例如
CustomerViewModel)并且是模型实例的某种“机甲套装”,提供额外的功能,例如计算属性(例如来自@的Duration987654328@ 和EndTime)。一般公司有很多Customers,所以会有很多CustomerViewModels。
那么如何包装模型实例呢?
一个想法可能是创建派生自ViewModelBase 的包装类,但不使用ViewModelLocator 注册和实例化那些。我认为将两个单独的东西都称为 ViewModel 并不是一个好主意。
另一个想法可能是为第二种 ViewModel 使用一个新的基类,可能称为ModelInfo。在MainViewModel 的单个实例中,会有CustomerInfo 实例的集合,为Customer 模型数据提供附加功能。
我倾向于后者,但由于这似乎是使用 MVVM Light 的一个非常普遍的情况,我相信这个问题必须有一个通用的解决方案。
更新
我找到了an article by Laurent Bugnion,MVVM Light 的作者。 在他 2012 年的文章中,Bugnion 使用了两种不同的方法来初始化 ViewModel:
-
MainViewModel注册到ViewModelLocator并且没有构造函数参数。因此它适用于依赖注入,可以通过ServiceLocator实例化。 -
FriendViewModel未在ViewModelLocator中注册,其构造函数将 Model 实例作为参数。不能用ServiceLocator实例化,只能直接调用构造函数,传递模型实例。
这与我最初的问题中提到的区别非常一致,并且与如何包装模型实例的第一个想法一致。
【问题讨论】:
-
我不明白您为什么需要“CustomerViewModel”。这对我来说就像一个模型类。我通常在我的 VM 中有一个类似于“SelectedCustomer”的属性,它可以将信息从模型类传递到模型类。
标签: c# wpf mvvm entity-framework-6 mvvm-light