【问题标题】:How do I maintain coherency between model and view-model in MVVM pattern?如何在 MVVM 模式中保持模型和视图模型之间的一致性?
【发布时间】:2009-02-03 13:24:03
【问题描述】:

问题陈述

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

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

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

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

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

问题:

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

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

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      Karl 正在为此努力:http://karlshifflett.wordpress.com/mvvm/

      【讨论】:

        【解决方案3】:

        你需要在视图模型中明确 ObservableCollections 所以,是的,你需要两个 模型和视图模型中完全不同的集合类型。

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

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

        Part 1: Using the Viewmodel pattern to provide Undo / Redo in WPF

        Part 2: Viewmodelling lists(这里是 MirrorCollection 定义)

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-06-14
            • 2020-01-09
            • 2010-10-28
            • 2011-01-07
            • 2014-05-27
            • 2013-08-31
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多