MVVM,集合和ORM

时间:2010-12-09 23:16:26

标签: wpf mvvm

我试图将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在大多数情况下,对象可以简单地重新创建。

2 个答案:

答案 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 。以下是从启动到完成的典型用户操作:

  1. 用户点击“添加”按钮
  2. ViewModel要么引发Presenter订阅的事件,要么在演示者上调用方法,要么只调用构造ViewModel时Presenter提供给ViewModel的回调。基本上它将动作委托给Presenter。
  3. Presenter在模型上调用Add。
  4. 模型对Add调用做出反应,更新所有相关状态,包括普通旧集合。
  5. 演示者已经对模型执行了操作,然后从模型中读取新状态,将状态写入ViewModel 。绑定负责同步视图。
  6. 因此,在您的情况下,Presenter可以在ViewModel中的CollectionChanged上订阅ObservableCollection事件,当它发生更改时,它会通过调用模型上的Add来对事件做出反应。另一方面,当Presenter正在处理一些在模型上调用Add的其他用户操作时(它知道因为它处理与模型的所有交互),那么它知道它必须传播该更改到ViewModel中的ObservableCollection

    在我的代码中,我简化了这种情况......在演示者对模型执行每个用户操作之后,我将模型中所有相关状态的直接副本复制到适用的位置在ViewModel中。您正在做的工作比您需要的多一点,但在典型的CRUD类型的应用程序中,没有明显的性能问题。如果我有一个非常大的对象集合,性能可能是一个问题,并且我将下拉到更细粒度的同步(仅更新已更改的实体),而代价是更复杂的逻辑。