我的目标是在应用程序的其余部分(可见UI)之前加载我的数据服务之一。
在尝试预加载我的数据服务之前,我的MVVMlight设置相当不错。
在我的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无法加载?有没有办法强迫它手动加载应用程序资源?还是有更好的方法?
答案 0 :(得分:0)
我终于找到了解决方案。
诀窍是从应用程序资源中手动实例化ViewModelLocator
。
private ViewModelLocator viewModelLocator = App.Current.Resources["Locator"] as ViewModelLocator
然后可以根据需要通过viewModelLocator.Main
(或您分配的任何属性名称)访问视图模型。
此位的放置很重要。它不适用于App构造函数,但适用于Application_Startup事件处理程序。最后,我放入了自己的类,该类是从Application_Startup加载的,比起其他方式,它可以使我的App.xaml.cs保持干净。
使用了一段时间后,我开始喜欢它了,并且可能会开始更多地使用它。当不需要我的Messenger服务时,它使在视图模型之间关联事件变得非常容易。