класс.
стория: я создаю приложение WPF с использованием MVVM и использую DI-контейнер для построения моих ViewModels
Мой 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; component / mainwindow.xaml» Строка 8, позиция 45.
Насколько я могу судить,<Application.Resources>
раздел просто не читается из файла xaml. Я могу поместить некоторый код в OnStartup, чтобы добавить ресурс программно следующим образом:
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
Однако это ужасный хак, и он не поможет мне, если я захочу добавить что-то еще в файл app.xaml позже :-(
Должен ли я подключить какое-то другое событие? Это можно обойти?