背景: MVVM を使用して WPF アプリを作成し、DI コンテナーを使用して ViewModel を構築しています
私の 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 にハードコードされているため、これは望ましくありません。
見つけたいくつかのブログ投稿と記事のガイダンスに従って、 を削除し、次のように App.xaml.cs にフックしStartupUri
て を作成しようとしました。MainWindow
OnStartup
protected override void OnStartup( StartupEventArgs e )
{
base.OnStartup(e);
new MainWindow().Show();
}
問題は、次の例外を除いて、ウィンドウを表示しようとするとアプリがクラッシュすることです。
「{serviceLocator}」という名前のリソースが見つかりません。リソース名は大文字と小文字が区別されます。マークアップ ファイル 'WpfApp;component/mainwindow.xaml' の行 8 位置 45 のオブジェクト 'System.Windows.Data.Binding' でエラーが発生しました。
私が知る限り、この<Application.Resources>
セクションは単に xaml ファイルから読み出されていません。OnStartup にコードを追加して、次のようにプログラムでリソースを追加できます。
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
ただし、これは醜いハックであり、後で app.xaml ファイルに何か他のものを入れたい場合は役に立ちません :-(
他のイベントをフックする必要がありますか?これを回避する方法はありますか?