【问题标题】:MVVM: How is the model view supposed to communicate with the data modelMVVM:模型视图应该如何与数据模型通信
【发布时间】:2011-01-15 18:18:50
【问题描述】:

我正在学习 MVVM,但我不明白的一件事是模型和视图模型应该如何通信。我也不明白它们是单独的类还是复合类,或者 ModelView 是否应该从模型继承。

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

View: ComboBox --> 绑定到 ModelView 中的 List。模型视图以 (?????) 方式连接到模型。将填充列表的数据可以通过 Web 服务调用来检索。这个场景是如何工作的?

【问题讨论】:

    标签: silverlight design-patterns oop mvvm


    【解决方案1】:

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

    在这种情况下:

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

    现在,您是将 Web 服务调用封装在另一个类(例如 Model)中还是将其保留在 ViewModel 中,很大程度上取决于您自己的偏好(例如,将它放在模型中允许通过注入 mock 来轻松测试 ViewModel,而不是正在运行的网络服务等)

    【讨论】:

      【解决方案2】:

      简而言之,视图模型完全了解模型,可以直接与之交互。不要过度考虑它们之间的相互作用。唯一的双盲关系是视图和视图模型之间的关系。

      【讨论】:

      • 你说双盲是指视图和模型吗?
      • @Rire:不,V 和 M 之间没有关系(为了清楚起见,我将使用缩写)。 M不知道VM或V。VM知道M。V不知道任何人。简而言之,知道另一个组件的唯一组件是VM,它只知道M。
      • 我认为 V 知道 VM 没有问题,所以不要在这一点上挂断@Rire
      【解决方案3】:

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

      我想指出的是,在阅读有关 MVVM 的信息时,很容易假设每个 MVVM“组合”始终存在三个物理文件。这就是我开始尝试 MVVM 时的想法,我心想“哇,有很多文件。哇,如果我在 Web 服务中有一些常用方法需要被多个调用模型类,那么我将有大量重复的代码。”。但是当我头脑清醒时,我意识到由我来决定什么在我的应用程序中最有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-09
        • 2018-03-13
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2016-04-13
        相关资源
        最近更新 更多