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

问题描述 投票:0回答:1

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

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

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

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

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

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

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

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

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

我的第一个想法是这是一个时间问题,但如果我添加延迟,我仍然会得到错误。因此,似乎在加载视图之后才加载应用程序资源。我不会想到这一点,因为app.xaml和app.xaml.cs实际上是同一个类的一部分。无论如何,我不知道如何解决这个问题,或者我是否可以。

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

c# wpf mvvm-light
1个回答
0
投票

我终于找到了解决方案。

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

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

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

放置这个位很重要。它不能从App构造函数中运行,但它可以从Application_Startup事件处理程序中运行。我最终放入了自己从Application_Startup加载的类,更多的是保持我的App.xaml.cs干净。

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

© www.soinside.com 2019 - 2024. All rights reserved.