2013-11-25 3 views
1

Я использую шаблон MVVM с подсветкой MVVM. У меня есть ViewModelLocator, определенный в App.xaml, который содержит все ViewModels, которые связаны с представлениями с использованием Blend.Как получить доступ к ресурсу, определенному в App.xaml из OnLaunched?

У меня есть AppViewModel, который в основном содержит всю важную глобальную информацию для моего приложения, например пользовательские настройки. AppViewModel создается экземпляром ViewModelLocator, который, в свою очередь, создается экземпляром app.xaml.

Проблема заключается в том, что мне нужно получить доступ к AppViewModel изнутри OnLaunched, однако на этом этапе жизненного цикла приложения, похоже, app.xaml еще не создала свои объявленные ресурсы. Похоже, это делается только после Frame.Navigate().

Мне нужно получить доступ к AppViewModel, потому что я должен проверить свойства там, чтобы определить, какую страницу загрузить. Следовательно, это ситуация с курицей и яйцом.

Если я отдельно создаю AppViewModel внутри OnLaunched, то я могу получить доступ к AppViewModel, но затем ViewModelLocator получает экземпляр дважды, что вызывает проблемы с моим IoC.

Есть ли способ вручную создавать объекты, объявленные внутри app.xaml? Или есть способ заставить app.xaml загружать свои ресурсы перед представлением пользовательского интерфейса?

Или я делаю это неправильно? Вообще говоря, я рассматриваю приложение как слой модели представления, и взгляды по существу замечают, что ... поэтому поэтому мне нужны 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 иначе инициализировать или всякий раз, когда вам нужно? Вам не нужно добавлять пары значений ключа в ResourceDictionaries в XAML всегда.

+0

Поскольку приложение должно быть Blendable, что означает, что оно должно быть объявлено в xaml. – krisdyson

+0

По крайней мере, я думаю, что его нужно объявить в App.xaml, чтобы включить привязки в Blend !? – krisdyson

+0

Нет, он может быть также определен в App.xaml.cs или в любом месте. Вы просто хотите добавить его в «Application.Resources», если именно так вы хотите получить доступ к вашему «ViewModelLocator». –

Смежные вопросы