首页 > 解决方案 > 在 WPF 应用程序中使用 MVVMLight ViewModelLocator 时如何在 MainViewModel 之前加载 DataService?

问题描述

我的目标是在应用程序的其余部分(可见 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 实际上属于同一类。无论如何,我不确定如何解决这个问题,或者我什至可以。

为什么 ViewModelLocator 在没有视图的情况下无法加载?有没有办法强制它手动加载应用程序资源?或者,还有更好的方法?

标签: c#wpfmvvm-light

解决方案


我终于找到了解决办法。

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

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

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

该位的放置很重要。它不适用于 App Constructor,但它适用于 Application_Startup 事件处理程序。我最终放入了我从 Application_Startup 加载的自己的类,以保持我的 App.xaml.cs 的清洁。

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


推荐阅读