在 WPF 应用程序中使用 MVVMLight ViewModelLocator 时如何在 MainViewModel 之前加载 DataService?

How to load DataService before MainViewModel when using MVVMLight ViewModelLocator in WPF app?

我的目标是在应用程序的其余部分之前加载我的数据服务之一(可见 UI)。

在尝试预加载我的数据服务之前,我的 MVVMlight 设置非常好。

在我的 App.xaml.cs 中,主视图是这样加载的。

var mainWindow = new View.MainWindow();
mainWindow.Show();

为了预加载我的数据服务,我将我的数据服务设置为 createInstanceImmediately,然后在 mainWindow 代码上方添加了以下内容。

DataService dataService = SimpleIoc.Default.GetInstance<IDataService>();

该行生成异常 "CommonServiceLocator.ActivationException: 'Type not found in cache: Namespace.IDataService.'"

如果将该行移到 mainWindow 代码下方,它就可以正常工作。

我一开始以为是时序问题,但加了个延迟,还是报错。因此,应用程序资源似乎在加载视图之后才加载。我不会不这么认为,因为 app.xaml 和 app.xaml.cs 实际上是同一个 class 的一部分。无论如何,我不确定如何解决这个问题,或者我是否可以。

为什么没有视图时 ViewModelLocator 不加载?有没有办法强制它手动加载应用程序资源?或者有更好的方法吗?

我终于找到了解决办法。

诀窍是从应用程序资源中手动实例化 ViewModelLocator

private ViewModelLocator viewModelLocator = App.Current.Resources["Locator"] as ViewModelLocator

如果需要,可以通过 viewModelLocator.Main(或您指定的任何 属性 名称)访问视图模型。

这个位的放置很重要。它在 App Constructor 中不起作用,但在 Application_Startup 事件处理程序中起作用。我最终放入了我从 Application_Startup 加载的自己的 class,更多的是为了保持我的 App.xaml.cs 干净。

使用了一段时间后,我越来越喜欢它,并且可能会开始更频繁地使用它。当我的需求不需要 Messenger 服务时,它可以很容易地在视图模型之间连接我的事件。