问题陈述
我正在编写一个非常基本的WPF应用程序来改变配置文件的内容。数据格式是带有架构的XML文件。我想将它用作MVVM的学习项目,所以我已经将代码分成了
模型:从xsd.exe自动生成的C#类
视图模型:模型的视图友好表示。
查看:Xaml和空代码
我理解View-Model如何使View-binding变得轻而易举。但是,不会留下View-Model< - >模型语义很尴尬? Xsd.exe生成带有多个XML元素数组的C#类。但是,在V-VM级别,您需要Observable Collections。
问题:
这是否真的意味着我必须保持两个完全不同的集合类型代表相同的数据?
维持模型与视图模型之间一致性的最佳实践是什么?
答案 0 :(得分:6)
我不是一个大专家,但我认为是的。一般的想法确实是通过Binding传播视图和viewModel之间的变化,然后通过事件(在Model - > ViewModel方向)或依赖(在另一个方向)传播ViewModel和Model之间的变化。
我不知道它是多么标准,但我对MVVM的理解是ViewModel应该保存对模型的引用,这样当用户修改视图时,ViewModel应该调用模型上的相应代码。反过来说,模型应该在修改时引发事件,并且ViewModel应该相应地更新自身(ViewModel是模型的观察者)。
答案 1 :(得分:2)
@这真的意味着我必须保留两个完全不同的集合类型来表示相同的数据连贯性吗?
我想是的。这很无聊,但效果很好。希望将来我们还有一个代码生成器来创建ViewModel部分。
答案 2 :(得分:2)
你需要在viewmodel上清楚地看到ObservableCollections所以,是的,你需要两个 模型和视图模型中完全不同的集合类型。
我做了一篇关于在MVVM中进行撤消/重做的文章,在那里你可以找到一个可能的解决方案。它使用我所谓的 MirrorCollection :一个ObservableCollection派生类,它自动从List(模型列表)中获取他的项目。
我认为这是一个有趣的解决方案,你可以在这里找到文章
Part 1: Using the Viewmodel pattern to provide Undo / Redo in WPF
Part 2: Viewmodelling lists(这是MirrorCollection定义)
答案 3 :(得分:0)
在Model中展示事件或委托并在ViewModel中挂钩,当模型中的值更改通过事件或委托通知viewmodel时,您可以通过Viewmodle更新UI。
如果你想将它从视图模型更新为模型,只需调用某个方法传递新值