我试图将MVVM设计模式与WPF和Entity Framework一起使用来创建一个简单的应用程序。如果课程松散耦合,一切顺利,好,但如果我有......比如两个模型类:Customer和Address,Customer有一组Addresses。
现在,对于那些类,我需要创建两个VM类 - CustomerVM和AddressVM。 CustomerVM应具有AddressVM对象的ObservableCollection。对这些VM类(包括CustomerVM和AddressVM上的所有CRUD操作)所做的每一次更改都需要反映在模型类中 - 这就是为什么我最终编写了一些代码,例如。订阅ObservableCollection的已更改事件,如果添加了新对象,则向模型添加新对象......依此类推......
该怎么办?使用MVVM时这是常见的吗?我做的一切都好吗?如何减少这种简单类层次结构所需的代码量?是否有任何框架可以创建与层次结构中的其他类“表现良好”的基本VM类?如果阶级关系变得更复杂怎么办?
或者让它变得简单:
如何反映模型集合中vm集合中所做的更改:
CustomerVM1.AdressesVM.Add(new AddressVM{City="New York"})
应该导致相当于:
Customer1.Adresses.Add(new Address{City="New York"})
反过来也有同样的问题 - 如何反映模型中集合所做的更改要包含在视图模型中,但我对第一个更感兴趣,因为它有更实用的应用程序和vm在大多数情况下,对象可以简单地重新创建。
答案 0 :(得分:1)
您可能对 WPF Application Framework (WAF) 的 BookLibrary 示例应用感兴趣。它展示了如何一起使用Entity Framework和MVVM。
简短提示:它不会为每个Entity类创建包装器ViewModel。相反,它为视图创建ViewModel类。
答案 1 :(得分:0)
在尝试弄清楚我的ViewModel中的ObservableCollection
是否与模型中的普通旧集合同步时,您遇到了与我遇到的完全相同的问题。 ObservableCollection
非常棒,因为View可以绑定到它并在集合更改时自动更改。不幸的是,你刚刚将同步问题降低了一个级别。
一种选择是在任何地方使用ObservableCollections,即使在模型中也是如此。这不是非常干净的架构,因为MVVM不应该对模型提出任何要求。
我要解决的问题是介绍一个Presenter,所以我的架构看起来像这样:
View -> ViewModel <-> Presenter <-> Model
另外,我制作了我的ViewModels dumb 。以下是从启动到完成的典型用户操作:
因此,在您的情况下,Presenter可以在ViewModel中的CollectionChanged
上订阅ObservableCollection
事件,当它发生更改时,它会通过调用模型上的Add来对事件做出反应。另一方面,当Presenter正在处理一些在模型上调用Add的其他用户操作时(它知道因为它处理与模型的所有交互),那么它知道它必须传播该更改到ViewModel中的ObservableCollection
。
在我的代码中,我简化了这种情况......在演示者对模型执行每个用户操作之后,我将模型中所有相关状态的直接副本复制到适用的位置在ViewModel中。您正在做的工作比您需要的多一点,但在典型的CRUD类型的应用程序中,没有明显的性能问题。如果我有一个非常大的对象集合,性能可能是一个问题,并且我将下拉到更细粒度的同步(仅更新已更改的实体),而代价是更复杂的逻辑。