一些MVVM问题(WPF C#)

时间:2010-01-06 19:49:22

标签: c# wpf mvvm algorithm

我最近一直在研究MVVM,我似乎得到了整体想法。虽然我不完全明白并且正在跳跃以获得一些答案,但还有一些不起眼的位,干杯!

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

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

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

  4. 很抱歉,如果这是一个很多问题,我会在一个窗口或页面感觉中了解MVVM,但是一旦我添加多个视图,我的系统就会崩溃。我可以使用单独的模型访问外部源来获取其数据,但如果数据需要在视图之间持续存在,我就会迷失。

    感谢所有花时间回应!

3 个答案:

答案 0 :(得分:5)

一些想法:

  1. 简单的应用程序不一定需要MVVM的复杂性 - 您可以通过消除ViewModel并直接使用底层模型来逃脱。请注意,不要将此方法延伸到断点 - 因为WPF非常依赖于诸如INotifyPropertyChanged和DependencyProperties之类的东西。您不希望开始将它们合并到您的模型类中。

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

  3. 你无法避免MVVM中的某种程度的耦合。然而,(如果我理解你的问题正确)引入ModelViews之间的耦合可能是一个坏主意 - 因为它正在击败目的在为特定视图优化的模型上制作每个视角。

答案 1 :(得分:1)

我自己的经历:

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

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

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

  4. 如果您已经阅读过本文,我不会感到惊讶,但对于那些希望了解MVVM设计的人来说,这是一个很好的Link

答案 2 :(得分:1)

  

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

`DataStore myData = new DataStore; `

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

  

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

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

  

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

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