首页 > 解决方案 > 使用 MVVM 正确初始化程序

问题描述

我一直在涉足 MVVM。事实上,我虔诚地尝试遵循它的规则和最佳实践。

如何正确处理程序初始化?

具体来说,我很困惑为什么要首先调用视图(来自 App.xaml)。

我的假设是,控制器仍然拥有视图的抽象(ViewModel)并使用它来更新视图。(我更喜欢将表示和处理分成不同的类,我猜这会成为“MVVMC”)。所以在我看来,视图不应该是第一个被初始化的东西。话虽如此,我的解决方案是从 app.xaml 代码隐藏中启动控制器并将 ViewModel 传递给控制器​​。

尽管我得到了一个很好的信息管道,但我觉得这不是正确的方法,因为我仍在使用 app.xaml 代码隐藏。

这是我的应用程序的样子:

那么,初始化应用程序的最佳/最有效/最被接受的方式是什么?

标签: c#wpfmvvm

解决方案


首先,MVVM 不是一个非常严格的规则集,它确实为各种各样的风格留出了空间。

根据是先实例化 View 还是 ViewModel,您可以区分两种方法:

  1. ViewModel first方法,首先创建 ViewModel 的实例,然后通常根据某些约定选择 View。DataTemplateSelector 就是一个很好的例子。

  2. 视图优先方法,首先创建视图(通常是 Window 或 UserControl)并选择使用一些约定视图。为自己创建一个 ViewModel 实例可能是 View 的责任,或者它可能被委托给其他人。

初始化时,必须始终在 app.xaml resp app.xaml.cs 中完成,因为它是您的应用程序的入口点。您还必须意识到,应用程序进程绑定到 Dispatcher 循环。当您的应用程序中的最后一个窗口关闭时,调度程序循环结束并且应用程序进程退出。最后一个窗口通常是 MainWindow。

此外,还要考虑应用程序的启动时间。您想尽快显示一些窗口。因此,如果您想在窗口显示之前执行任何逻辑,请确保您不执行任何 I/O、数据库或 API 调用等。

我通常有从 App.xaml.cs 调用的 Bootstrapper.cs 类。它的职责是设置 IoC 并显示 UI。它可能是一个加载窗口,然后是 MainWindow。

在 Bootstrapper.cs 中,您可以先创建 MainWindowViewModel 的实例,然后创建 MainWindow 并将 ViewModel 分配给它的 DataContext,或者您可以只创建 MainWindow 并将 ViewModel 的创建留给 MainWindow 本身。我倾向于做后者。

这两种方法都没有错,也没有违反 MVVM 原则。

我给你的最大建议是——如果你不能在两个或多个选项之间做出决定,选择更简单的。或者换句话说,除非你有充分的理由,否则不要把事情复杂化。吻


推荐阅读