【问题标题】:Some MVVM questions (WPF C#)一些 MVVM 问题 (WPF C#)
【发布时间】:2010-01-07 04:10:04
【问题描述】:

我最近一直在研究 MVVM,我似乎明白了整体的想法。虽然有一些琐碎的部分我不完全理解,但我希望在这里得到一些答案,干杯!

  1. 对整个应用程序使用一种数据模型是否不正确。通常,如果我正在创建一个小型实用程序,我会将所有逻辑数据放在一个类中。这意味着我可以拥有以下内容:

    DataStore myData = new DataStore;
    
  2. 如果可以拥有一个数据模型,是否可以拥有多个模型视图,比如一个代表每个窗口或视图的模型视图(这就是我设想 MVVM 的工作方式)。

  3. 鉴于上述情况,如果一个有多个模型视图,模型似乎必须在第一个窗口(视图)之前声明,它应该在哪里声明?模型是否应该通过对后续模型视图的引用来传递?这是否不是耦合源,因为窗口或页面(视图)需要了解模型才能将其传递给其模型视图,因为视图实例化了模型视图。

抱歉,如果这是很多问题,我在单个窗口或页面意义上理解了 MVVM,但是一旦我添加了多个视图,我的系统就会崩溃。我可以让它与访问外部源以获取其数据的单独模型一起使用,但如果数据需要在视图之间保留,我会迷路。

感谢所有花时间回复的人!

【问题讨论】:

  • 我想补充。如果数据需要在不同模型之间持久化,模型是否应该将数据发送到外部源?模型是否仅在存储和模型视图之间移动数据?

标签: c# wpf mvvm algorithm


【解决方案1】:

一些想法:

  1. 简单的应用程序不一定需要 MVVM 的复杂性 - 您也许可以摆脱 ViewModel - 并直接使用底层模型。请注意不要将这种方法延伸到断点 - 因为 WPF 非常依赖于 INotifyPropertyChanged 和 DependencyProperties 之类的东西。您不想开始将这些不必要地合并到您的模型类中。

  2. 是的,没关系。但是,... 请记住,如果只有一个 Model 实例会更简单 - 否则您需要在要保存(或丢失一个版本的更改)时合并来自多个视图的更改。如果 ViewModel 引用相同的底层模型,这是可行的。

  3. 在 MVVM 中,您无法避免一定程度的耦合。但是,(如果我正确理解您的问题)在 ModelView 之间引入耦合可能是个坏主意 - 因为它违背了目的使每个模型成为针对特定视图优化的模型的离散视角。

【讨论】:

  • 完全同意:数据绑定架构的好处之一是您可以在简化的模型视图架构中工作,并且只有在您的视图开始需要它时才可以扩展到更复杂的 MVVM 方法。而且我不会回避在您的模型类上实现 INotifyPropertyChanged 以支持更简单的架构(尽管我同意一旦您开始需要推出 DP,您可能会进入视图模型领域)。
  • 是的,你理解正确。我知道我可以通过缩短流程来侥幸成功,但我正在尝试(令人沮丧地我可能会补充)在使用更大的应用程序之前学习 MVVM。看来我的整体问题是模型之间的数据持久化。也许我对模型的概念有误,我将编辑我的帖子以反映这一点。
  • 您应该避免让 MV 负责管理持久数据。他们应该立即(或在明确定义的点)将他们的更改合并到底层模型类中。这避免了处理不同视图之间的持久性差异。
【解决方案2】:

我自己的经验:

  1. 我认为对整个应用程序使用一个数据模型没有任何问题,具体取决于您想要做什么。只要您将其与您的 View 分开,您就处于 MVVM 设计模式中。

  2. 我个人喜欢为我的每个视图使用一个模型视图。我认为对此有不同的论点,但我个人认为,通过这样做,一切都更加模块化和可单元测试。

  3. 我尽量避免模型视图之间的耦合。如果我的每个视图都有一个 ModelView,我会在每个视图中分别声明每个 ModelView。然后我通过事件将每个视图实例化到我的主视图中。这与 MVVM 模式保持一致,您可以单独对每个 ModelView 进行单元测试。

如果您已经阅读了这篇文章,我不会感到惊讶,但是对于那些想要了解 MVVM 设计的人来说,这里有一个很好的 Link

【讨论】:

  • 天哪,这是一篇密集的文章,我不会假装理解其中的所有内容,但至少它给了我一个要做的事情清单来学习!谢谢!
【解决方案3】:

使用一个数据是否不正确 整个应用程序的模型。 通常,如果我正在创建一个小 我会拥有所有的 一类中的逻辑数据。这个 意味着我可以拥有类似的东西 以下:

`DataStore myData = new DataStore; `

这很好。您的数据模型就是您的数据模型,应该以尽可能最好的方式表示数据,无论是一类还是 1000 个。

如果可以拥有一个数据模型 可以拥有多个模型吗 查看,说一个代表每个 窗口或视图(这就是我 设想 MVVM 工作)。

当然,在我看来,这正是你应该做的。一般来说,我会说每个视图都需要一个视图模型,无论视图是控件还是窗口。在某些情况下,您可能会发现为特定视图拥有多个视图模型会有所帮助,但我会首先确定我没有应该拆分的视图。

如果一个有多个 模型视图似乎 模型必须在之前声明 第一个窗口(视图),应该在哪里 它被宣布?模型应该是 通过对后续的引用传递 模型视图?这不是一个 耦合源作为窗口或 页面(视图)需要了解 模型将其传递给其模型视图 因为视图实例化了模型 查看。

现在你正在进入宗教领域。我将对此稍加强调,并说做对您的应用程序有意义的事情。也就是说,如果您想减少模型与视图/视图模型之间的耦合,我强烈建议您从模型类中提取接口。在 App.xaml.cs 文件中创建模型然后将其作为接口的实现传递给视图(模型)会相当简单。

【讨论】:

  • @你的最后一点:我认为它似乎是 MVVM 中回答最少的部分大多数示例显示单一用法示例,但我还没有看到通过模型持久性的具体示例。谢谢,我会修改你的建议!
猜你喜欢
  • 2010-12-15
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多