【问题标题】:How to load DataService before MainViewModel when using MVVMLight ViewModelLocator in WPF app?在 WPF 应用程序中使用 MVVMLight ViewModelLocator 时如何在 MainViewModel 之前加载 DataService?
【发布时间】:2019-01-22 21:02:44
【问题描述】:

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

在尝试预加载我的数据服务之前,我的 MVVMlight 设置库存充足。

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

在我的 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 在没有视图的情况下无法加载?有没有办法强制它手动加载应用程序资源?还是有更好的办法?

【问题讨论】:

  • 创建窗口前需要移动服务注册。它应该是您的 App 类构造函数中的第一行之一

标签: c# wpf mvvm-light


【解决方案1】:

我终于找到了解决办法。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 2011-08-27
    • 2012-10-29
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多