c# - 在 WPF 应用程序中使用 MVVMLight ViewModelLocator 时如何在 MainViewModel 之前加载 DataService?
问题描述
我的目标是在应用程序的其余部分(可见 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 实际上属于同一类。无论如何,我不确定如何解决这个问题,或者我什至可以。
为什么 ViewModelLocator 在没有视图的情况下无法加载?有没有办法强制它手动加载应用程序资源?或者,还有更好的方法?
解决方案
我终于找到了解决办法。
诀窍是ViewModelLocator
从应用程序资源中手动实例化。
private ViewModelLocator viewModelLocator = App.Current.Resources["Locator"] as ViewModelLocator
如果需要,可以通过viewModelLocator.Main
(或您分配的任何属性名称)访问视图模型。
该位的放置很重要。它不适用于 App Constructor,但它适用于 Application_Startup 事件处理程序。我最终放入了我从 Application_Startup 加载的自己的类,以保持我的 App.xaml.cs 的清洁。
在使用了一段时间后,我越来越喜欢它并且可能会开始更频繁地使用它。当我的需要不需要信使服务时,它可以很容易地在视图模型之间连接我的事件。
推荐阅读
- sql - Oracle中基于多列的数据透视
- python - 在 sympy 中绘制微分方程不起作用
- javascript - 使用状态在reactjs中使div选择取消选择
- jpa - 如何使用 JPA 规范访问加入实体的列?
- r - 在 R 基础图中自定义 R 中的日期轴
- docker - Circle Ci 启动事件处理器失败
- sql - 如何让 VSCode 扩展 SQL Formatter 工作?
- visual-studio-code - 导入路径不能以“.ts”扩展名结尾。考虑改为导入“https://deno.land/std@0.109.0/http/server”
- opencv - GStreamer:如何使用 v4l2convert 而不是 videoconvert
- html - 水平滚动 - 居中当前元素