如何从OnLaunched访问App.xaml中定义的资源?

时间:2013-11-25 12:33:49

标签: xaml windows-8 windows-runtime winrt-xaml windows-8.1

我正在使用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信息:无法找到具有给定密钥的资源。

感谢

1 个答案:

答案 0 :(得分:0)

如果您在第一次需要时实例化ViewModelLocator,然后在Application.Resources初始化或需要时将其添加到Application.Resources,该如何?您不需要始终将键值对添加到XAML中的ResourceDictionaries

相关问题