我正在使用MVVM模式和MVVM Light。我有一个在App.xaml中定义的ViewModelLocator,它包含使用Blend从Views中绑定的所有ViewModel。
我有一个AppViewModel,它基本上包含我的应用程序的所有重要全局信息,如用户首选项。 AppViewModel由ViewModelLocator实例化,然后由app.xaml实例化。
问题是,我需要从OnLaunched内部访问AppViewModel,但是,在应用程序生命周期的这个阶段,app.xaml似乎还没有实例化其声明的资源。它似乎只在Frame.Navigate()之后执行此操作。
我需要访问AppViewModel,因为我必须检查那里的属性,以便确定要加载的页面。因此,这是鸡与蛋的情况。
如果我在OnLaunched中单独实例化AppViewModel,那么我可以访问AppViewModel,但是ViewModelLocator会被实例化两次,这会导致我的IoC出现问题。
有没有办法手动实例化app.xaml中声明的项目?或者有没有办法让app.xaml在呈现UI之前加载其资源?
或者我做错了吗?一般来说,我认为应用程序是视图模型层,视图基本上观察到...因此我需要在呈现任何UI之前提供ViewModel。
XAML:
<Application.Resources>
<vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />
</Application.Resources>
代码:
protected override void OnLaunched(LaunchActivatedEventArgs e)
{
var vml = App.Current.Resources["Locator"] as ViewModelLocator; // exception raised
例外:
WinRT信息:无法找到具有给定密钥的资源。
感谢
答案 0 :(得分:0)
如果您在第一次需要时实例化ViewModelLocator
,然后在Application.Resources
初始化或需要时将其添加到Application.Resources
,该如何?您不需要始终将键值对添加到XAML中的ResourceDictionaries
。