2013-11-25 38 views
1

我在MVVM Light中使用MVVM模式。我有一个在App.xaml中定义的ViewModelLocator,它保存了使用Blend从视图中绑定的所有ViewModel。如何访问OnLaunched中App.xaml中定义的资源?

我有一个基本包含了所有我的应用程序的重要的全球信息,如用户的喜好的AppViewModel。 AppViewModel由ViewModelLocator实例化,然后由app.xaml实例化。

问题是,我需要从OnLaunched中访问AppViewModel,但是,在应用程序生命周期的这个阶段,它似乎app.xaml尚未实例化其声明的资源。它似乎只能在Frame.Navigate()之后执行此操作。

我需要访问AppViewModel因为我有检查,以找出要加载的页面上出现的属性。因此这是鸡与鸡蛋的情况。

如果我在OnLaunched内部单独实例化AppViewModel,则可以访问AppViewModel,但ViewModelLocator会实例化两次,这会导致IoC发生问题。

有手动实例里面的App.xaml申报项目的方式?或者有没有办法让app.xaml在呈现UI之前加载其资源?

还是我这样做不对?一般来说,我认为应用程序是视图模型层,视图本质上是观察...因此,我需要在呈现任何UI之前使用ViewModels。

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

你怎么样实例化ViewModelLocator当你第一次需要它,然后将其添加到Application.Resources一旦Application.Resources另有初始化或当你需要什么?您无需将键值对始终添加到XAML中的ResourceDictionaries

+0

因为应用需要是可共混的,这意味着它具有在XAML中声明。 – krisdyson

+0

至少我认为它需要在App.xaml中声明才能在Blend中启用绑定! – krisdyson

+0

不,它可以在App.xaml.cs中定义,也可以在你想要的任何地方定义。如果你想要访问你的'ViewModelLocator',你只需要将它添加到'Application.Resources'中。 –