Фон: я создаю приложение WPF с использованием MVVM и используя контейнер DI для создания моих ViewModels
My App.xaml выглядит следующим образом:
<Application x:Class="WpfApp.App"
...xmlns etc...
StartupUri="MainWindow.xaml">
<Application.Resources>
<app:ServiceLocator x:Key="serviceLocator" />
</Application.Resources>
</Application>
MainWindow.xaml выглядит следующим образом:
<Window x:Class="CompositeMefWpfApp.MainWindow"
...xmlns etc... >
<Control.DataContext>
<Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" />
</Control.DataContext>
Теперь все работает нормально, но StartupUri
жестко закодирован в XAML, чего я не хочу.
Следуя указаниям нескольких блог-страниц и статей, которые я нашел, я удалил StartupUri
и попытался создать MainWindow
, запустив OnStartup
в App.xaml.cs, например:
protected override void OnStartup( StartupEventArgs e )
{
base.OnStartup(e);
new MainWindow().Show();
}
Проблема заключается в том, что при сбое приложения при попытке показать окно с этим исключением:
Невозможно найти ресурс с именем '{serviceLocator}'. Имена ресурсов чувствительны к регистру. Ошибка в объекте "System.Windows.Data.Binding" в файле разметки "WpfApp; компонент /mainwindow.xaml" Строка 8 Позиция 45.
Насколько я могу судить, раздел <Application.Resources>
просто не считывается из файла xaml. Я могу поместить некоторый код в OnStartup, чтобы добавить ресурс программно следующим образом:
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
Однако этот уродливый взлом и не помогает мне, если я захочу добавить что-то еще в файл app.xaml позже: - (
Должен ли я подключаться к другому событию? Есть ли способ обойти это?