【问题标题】:MVVM model instantiationMVVM 模型实例化
【发布时间】:2011-05-25 15:12:32
【问题描述】:

按照 WPF MvvmFoundation,将 View 与 ViewModel 链接有很多选择,如 http://www.paulstovell.com/mvvm-instantiation-approaches 中所述。

但是他们的示例并没有说明如何将 ViewModel 与 Model 链接起来。

传统上,我先创建模型,然后再创建一个或多个渲染它的视图。似乎 MVVM 推动人们创建视图,视图创建视图模型,视图模型创建模型。我希望情况并非如此,因为将复杂的业务模型与各种 ModelView 连接起来可能很困难。

您如何在 MVVM 中实例化您的业务模型类并将它们链接与您的 ViewModel?

【问题讨论】:

标签: wpf mvvm model instantiation


【解决方案1】:

我通常将模型对象作为构造函数参数传递给 VM。我使用 App 类作为控制器,它将使用主模型初始化 MainWindow、MainWindowViewModel。在 MainWindowViewModel 负责使用适当的模型对象初始化其他 VM 之后。

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        mainWindow = new MainWindow();
        mainWindow.DataContext = new MainWindowViewModel(new Model());
        mainWindow.Show();
    }

【讨论】:

    【解决方案2】:

    您在 ViewModel 中创建 BusinessModel 类。

    所以在你的CustomerViewModel 中你会说this.CurrentCustomer = new CustomerModel(),你的CustomerView 会绑定到ViewModel 上的CurrentCustomer 属性

    如果您有兴趣,我写了一个simple sample using MVVM 作为视图、模型和视图模型如何交互的示例。

    【讨论】:

    • 我看到它通常是这样工作的,但是当你有一个由多个相互关联的类组成的模型在后台做某事时,它就很难了。然后各种 ModelView 想访问模型中的各种类。当然,该模型可以被塑造成支持这一点,但它不会是真正的商业模型。
    • @Wernight 模型不应该在后台做任何事情。它们只是用来保存数据的虚拟容器。后台进程应该在 ViewModel 中运行。你的模型运行什么样的流程?
    • @Rachel:marlongrech.wordpress.com/2008/03/20/more-than-just-mvc-for-wpf 上的示例就足够了。 SearchProductList 应该显示所有项目,从而查看相同的 ProductList 模型。这意味着 ModelView 不应直接创建模型。
    • @Wernight 您发布的链接不使用 MVVM。它使用MVC,这不一样。如果您想在 MVVM 中的 ViewModel 之间实现类似的通信,我建议您查看 MVVM Light 的 Messenger 或 Prism 的 EventAggregator
    • @Rachel:当然可以。我的意思只是作为解决方案的提示。我用这种方式进行了一些 ViewModel 间的通信。仍然对于应该在互连模型中的业务逻辑,如果 MVVM 看起来,问题没有简单的解决方案。
    【解决方案3】:

    我使用依赖注入/MEF 来执行此操作。只需将我的所有模型类一直导出到整个链中,然后将它们自动导入到 ViewModel 构造函数中。

    【讨论】:

    • 那么你如何链接模型的实例呢?
    【解决方案4】:

    我会根据情况采取各种不同的方法。我发现在链接这些数据时,一种尺寸并不适合所有人。

    对于简单的情况,我将 ViewModel 和 Model 设置为同一个东西。显然不是对所有情况都那么好,但有时根本不需要加倍努力将 M 从 VM 中分离出来。 (非常适合您的列表框项目信息很少的情况)

    有时,尤其是当模型是您无权访问的代码块(由其他开发人员编写)时,很容易将模型子类化,并将所有 VM 事物(可观察属性等)添加到给它。

    最后,我将使用 Souvik 提到的方法。使用要用作参数的模型信息构造 VM,否则允许传入。对于我更大、更复杂的模型/视图模型关系,这可能是最常用的方法。

    【讨论】:

      【解决方案5】:

      我正在使用 IoC 容器将 IRepository 实例自动传递给 VM 构造函数,并且 VM 需要对模型执行的所有操作都是通过此存储库完成的。 Repository 是一个类:创建、读取、更新和删除数据。当我需要显示一些视图(窗口)时,我使用 IViewService.ShowDialog(viewModel As ViewModelBase)。在 IViewService 的实现中,有向 VM 注册的视图,因此 VM 只需要知道其他 VM 而不是它们的视图(如“显示此视图模型的视图”)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多