我在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的信息:無法找到與給定值的資源。
感謝
因爲應用需要是可共混的,這意味着它具有在XAML中聲明。 – krisdyson
至少我認爲它需要在App.xaml中聲明才能在Blend中啓用綁定! – krisdyson
不,它可以在App.xaml.cs中定義,也可以在你想要的任何地方定義。如果你想要訪問你的'ViewModelLocator',你只需要將它添加到'Application.Resources'中。 –