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

时间:2019-01-22 21:02:44

标签: c# wpf mvvm-light

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

在尝试预加载我的数据服务之前,我的MVVMlight设置相当不错。

  • ViewModelLocator在App.Xaml中初始化。
  • ViewModels和DataServices已注册,并且可以正常工作。

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

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

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

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

该行生成一个异常“ CommonServiceLocator.ActivationException:'在缓存中找不到类型:Namespace.IDataService。”

如果将该行向下移到mainWindow代码下方,则效果很好。

我首先想到的是时间问题,但是如果添加延迟,我仍然会收到错误消息。因此,似乎在加载视图之后才加载应用程序资源。我不会想到的是,因为app.xaml和app.xaml.cs实际上是同一类的一部分。无论如何,我不确定如何解决这个问题,甚至不确定。

为什么没有视图时ViewModelLocator无法加载?有没有办法强迫它手动加载应用程序资源?还是有更好的方法?

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案。

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

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

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

此位的放置很重要。它不适用于App构造函数,但适用于Application_Startup事件处理程序。最后,我放入了自己的类,该类是从Application_Startup加载的,比起其他方式,它可以使我的App.xaml.cs保持干净。

使用了一段时间后,我开始喜欢它了,并且可能会开始更多地使用它。当不需要我的Messenger服务时,它使在视图模型之间关联事件变得非常容易。