MVVM:模型视图应该如何与数据模型通信

时间:2010-02-11 15:07:45

标签: silverlight design-patterns oop mvvm

我正在学习MVVM,其中一个我没有得到的是模型和视图模型应该如何通信。我也不明白它们是单独的类,复合类,还是ModelView应该从模型继承。

我需要从Web服务获取一些数据,因此我认为该模型应该对其负责并进行适当的Web服务调用。但由于这些请求确实源于视图,因为用户想要查看某些信息,这意味着ModelView必须以某种方式将该请求转发给模型,然后提供异步通知机制,以便视图不会卡住模型异步检索数据。总而言之,假设我们有以下用例:

查看:ComboBox - >绑定到ModelView中的List。模型视图以(?????)方式连接到Model。可以通过Web服务调用检索将填充列表的数据。这种情况如何运作?

3 个答案:

答案 0 :(得分:4)

让我们让您的场景更复杂:用户单击一个按钮,然后需要使用来自Web服务的数据填充列表。

在这种情况下:

  • View的列表绑定到ViewModel中的ObservableCollection。
  • View的按钮绑定到ViewModel中的命令。
  • ViewModel的命令处理程序将向Web服务发出异步请求,并订阅将处理响应的侦听器。
  • 响应处理程序将使用响应中的项目填充可观察集合。由于View绑定到ObservableCollection,它将自动更新其在屏幕上的列表。

现在,无论是将Web服务调用封装在另一个类(例如Model)中,还是将其保存在ViewModel中,都要高度依赖于您自己的首选项(例如,在模型中使用它可以通过注入模拟来轻松测试ViewModel而不是运行的Web服务等。)

答案 1 :(得分:3)

简而言之,视图模型完全了解模型并可以直接与其进行交互。不要过分思考他们之间的互动。唯一的双盲关系是视图和视图模型之间的关系。

答案 2 :(得分:1)

我认为值得一提的是,你的MVVM“组合”并不总是需要三个不同的类。 V将永远是它自己的类,VM可能也需要它自己的类(尽管我不认为它),但如果适合你的应用程序,整个项目中的M可以是相同的。如果您正在构建一个小型应用程序,假设您总共只有10-15种不同的服务方法,那么让一个单独的类负责调用您的Web服务,处理错误并对各个VM进行异步回调可能是有意义的。 。如果你正在构建一个真正的小应用程序,也许只有一个VM,比如说2-3个绑定到那个VM的视图是有意义的。也许在这种情况下,您根本不需要单独的Model类,只需直接从VM调用Web服务即可。毕竟,您将创建对该Web服务的服务引用。然后生成的代理类将充当您的模型。

我想要指出的是,在阅读MVVM时,很容易假设每个MVVM“combo”总会有三个物理文件。这就是我开始尝试使用MVVM时的想法,我想我自己“哇,这是很多文件。哇,如果我在Web服务中有一些需要被多个调用的常用方法怎么办?模型类,然后我会在整个地方有大量的重复代码。“。但当我的头脑清醒时,我意识到由我来决定什么在我的应用程序中最有效。