在 WPF 应用程序中使用 MVVMLight ViewModelLocator 时如何在 MainViewModel 之前加载 DataService?
How to load DataService before MainViewModel when using MVVMLight ViewModelLocator in WPF app?
我的目标是在应用程序的其余部分之前加载我的数据服务之一(可见 UI)。
在尝试预加载我的数据服务之前,我的 MVVMlight 设置非常好。
- ViewModelLocator 在 App.Xaml 中初始化。
- ViewModels 和 DataServices 已注册,工作正常。
在我的 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 实际上是同一个 class 的一部分。无论如何,我不确定如何解决这个问题,或者我是否可以。
为什么没有视图时 ViewModelLocator 不加载?有没有办法强制它手动加载应用程序资源?或者有更好的方法吗?
我终于找到了解决办法。
诀窍是从应用程序资源中手动实例化 ViewModelLocator
。
private ViewModelLocator viewModelLocator = App.Current.Resources["Locator"] as ViewModelLocator
如果需要,可以通过 viewModelLocator.Main
(或您指定的任何 属性 名称)访问视图模型。
这个位的放置很重要。它在 App Constructor 中不起作用,但在 Application_Startup 事件处理程序中起作用。我最终放入了我从 Application_Startup 加载的自己的 class,更多的是为了保持我的 App.xaml.cs 干净。
使用了一段时间后,我越来越喜欢它,并且可能会开始更频繁地使用它。当我的需求不需要 Messenger 服务时,它可以很容易地在视图模型之间连接我的事件。
我的目标是在应用程序的其余部分之前加载我的数据服务之一(可见 UI)。
在尝试预加载我的数据服务之前,我的 MVVMlight 设置非常好。
- ViewModelLocator 在 App.Xaml 中初始化。
- ViewModels 和 DataServices 已注册,工作正常。
在我的 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 实际上是同一个 class 的一部分。无论如何,我不确定如何解决这个问题,或者我是否可以。
为什么没有视图时 ViewModelLocator 不加载?有没有办法强制它手动加载应用程序资源?或者有更好的方法吗?
我终于找到了解决办法。
诀窍是从应用程序资源中手动实例化 ViewModelLocator
。
private ViewModelLocator viewModelLocator = App.Current.Resources["Locator"] as ViewModelLocator
如果需要,可以通过 viewModelLocator.Main
(或您指定的任何 属性 名称)访问视图模型。
这个位的放置很重要。它在 App Constructor 中不起作用,但在 Application_Startup 事件处理程序中起作用。我最终放入了我从 Application_Startup 加载的自己的 class,更多的是为了保持我的 App.xaml.cs 干净。
使用了一段时间后,我越来越喜欢它,并且可能会开始更频繁地使用它。当我的需求不需要 Messenger 服务时,它可以很容易地在视图模型之间连接我的事件。