Я использую шаблон 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: Не удается найти ресурс с заданным ключом.
благодаря
Поскольку приложение должно быть Blendable, что означает, что оно должно быть объявлено в xaml. – krisdyson
По крайней мере, я думаю, что его нужно объявить в App.xaml, чтобы включить привязки в Blend !? – krisdyson
Нет, он может быть также определен в App.xaml.cs или в любом месте. Вы просто хотите добавить его в «Application.Resources», если именно так вы хотите получить доступ к вашему «ViewModelLocator». –