在MVVM模式中,我如何保持模型和视图模型之间的一致性?

8

问题陈述

我正在编写一个非常基本的 WPF 应用程序,用于修改配置文件的内容。数据格式是带有模式的 XML 文件。我想将其用作 MVVM 的学习项目,因此我已经将代码分为了以下三个部分:

  • 模型(Model): 从 xsd.exe 自动生成的 C# 类

  • 视图模型(View-Model): 模型的视图友好表示。

  • 视图(View): Xaml 和空白的代码后台

我理解视图模型如何使视图绑定变得轻松。然而,这是否意味着视图模型和模型之间的语义非常尴尬? xsd.exe 生成带有多个 XML 元素数组的 C# 类。但是,在视图模型层面上,您需要使用可观察集合(Observable Collections)。

问题:

这是否真的意味着我必须保持两种完全不同的集合类型来表示同一数据的协调?

在维护模型和视图模型之间的协调方面,有哪些最佳实践?

4个回答

6

虽然我不是专家,但我认为确实是这种情况。一般的想法是通过绑定在视图和viewModel之间传播变化,然后在模型-〉viewModel方向上通过事件(在模型中)或依赖关系(在另一个方向上)传播变化。

我不知道这是否标准,但我对MVVM的理解是ViewModel应该持有Model的引用,以便当用户修改视图时,ViewModel应该调用模型上的适当代码。反过来,当模型被修改时,模型应该引发事件,ViewModel应该相应地更新自己(作为模型的观察者)。


2

这是否意味着我必须保持两种完全不同的集合类型来表示相同的数据以保持一致性?

我认为是的。这很无聊,但它运行得非常好。希望将来我们也会有一个代码生成器来创建ViewModel部分。

Karl正在开发这个功能:http://karlshifflett.wordpress.com/mvvm/


2
您需要在视图模型中明确使用ObservableCollections,因此,在模型和视图模型中将需要完全不同的集合类型。
我已经写了一篇关于如何在MVVM中实现撤销/重做的文章,您可以在其中找到可能的解决方案。它使用我称之为“MirrorCollection”的ObservableCollection派生类,该类自动从List(模型的列表)获取其项。
我认为这是一个有趣的解决方案,您可以在这里找到文章: 第1部分:在WPF中使用ViewModel模式提供撤销/重做 第2部分:Viewmodelling列表(这里是MirrorCollection的定义)

0

在模型中公开事件或委托,并在ViewModel中挂钩到相同的事件或委托,每当模型中的值发生更改时,通过事件或委托通知ViewModel,然后您可以从ViewModel更新UI。

如果您想要从ViewModel更新到模型,只需调用一些方法传递新值即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接