2013-11-25 62 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'中。 –