Le contexte : Je crée une application WPF en utilisant MVVM et j'utilise un conteneur DI pour construire mes ViewModels.
Mon App.xaml ressemble à ceci :
<Application x:Class="WpfApp.App"
...xmlns etc...
StartupUri="MainWindow.xaml">
<Application.Resources>
<app:ServiceLocator x:Key="serviceLocator" />
</Application.Resources>
</Application>
MainWindow.xaml ressemble à ceci :
<Window x:Class="CompositeMefWpfApp.MainWindow"
...xmlns etc... >
<Control.DataContext>
<Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" />
</Control.DataContext>
Maintenant, tout cela fonctionne bien, mais le StartupUri
est codé en dur dans le XAML, ce que je ne veux pas.
En suivant les conseils de plusieurs articles de blog et d'articles que j'ai trouvés, j'ai supprimé la StartupUri
et a essayé de créer le MainWindow
par crochetage OnStartup
dans App.xaml.cs, comme ceci :
protected override void OnStartup( StartupEventArgs e )
{
base.OnStartup(e);
new MainWindow().Show();
}
Le problème est que l'application se plante lorsqu'elle essaie d'afficher la fenêtre, avec cette exception :
Impossible de trouver la ressource nommée '{serviceLocator}'. Les noms de ressources sont sensibles à la casse. Erreur au niveau de l'objet 'System.Windows.Data.Binding' dans le fichier de balisage 'WpfApp;component/mainwindow.xaml' Ligne 8 Position 45.
D'après ce que je sais, le <Application.Resources>
n'est tout simplement pas lue dans le fichier xaml. Je peux mettre du code dans le OnStartup pour ajouter la ressource de façon programmatique comme ceci :
Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();
Cependant, ce n'est pas très pratique et cela ne m'aide pas si je veux ajouter quelque chose d'autre dans le fichier app.xaml par la suite.
Devrais-je accrocher un autre événement ? Existe-t-il un moyen de contourner ce problème ?
Merci, Orion.