8

问题陈述

我正在编写一个非常基本的 WPF 应用程序来更改配置文件的内容。数据格式是带有架构的 XML 文件。我想把它作为一个MVVM的学习项目,所以我把代码适当的分成

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

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

  • 查看:Xaml 和后面的空代码

我了解 View-Model 如何使 View-binding 变得轻而易举。但是,这不是让 View-Model <-> Model 语义非常尴尬吗?Xsd.exe 为多个 XML 元素生成带有数组的 C# 类。但是,在 V-VM 级别,您需要 Observable Collections。

问题:

这真的意味着我必须保持两个完全不同的集合类型一致地表示相同的数据吗?

保持模型和视图模型之间一致性的最佳实践是什么?

4

4 回答 4

6

我不是一个大专家,但我认为是的。总体思路确实是通过 Binding 在视图和 viewModel 之间传播更改,然后通过事件(在 Model -> ViewModel 方向)或依赖关系(在另一个方向)在 ViewModel 和 Model 之间传播更改。

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

于 2009-02-03T13:33:38.627 回答
2

@这真的意味着我必须保持两种完全不同的集合类型一致地表示相同的数据吗?

我想是的。这很无聊,但效果很好。希望将来我们还会有一个代码生成器来创建 ViewModel 部分。

卡尔正在努力:http: //karlshifflett.wordpress.com/mvvm/

于 2009-02-03T13:52:34.347 回答
2

您显然需要在视图模型中使用 ObservableCollections,所以,是的,您需要在模型和视图模型中使用两种完全不同的集合类型。

我已经完成了一篇关于在 MVVM 中执行撤消/重做的文章,您可以在其中找到可能的解决方案。它使用我称之为MirrorCollection的东西:一个 ObservableCollection 派生类女巫自动从 List(模型列表)中获取他的项目。

我认为这是一个有趣的解决方案,您可以在此处找到文章

第 1 部分:使用 Viewmodel 模式在 WPF 中提供 Undo / Redo

第 2 部分:视图建模列表(这里是 MirrorCollection 定义)

于 2009-02-03T18:11:25.213 回答
0

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

如果您想将其从视图模型更新到模型,那么只需调用一些方法即可传递新值

于 2013-10-16T02:12:02.523 回答