Ajout DataTemplate (non XAML) à la ressource dictionnaire dans le code?
-
21-09-2019 - |
Question
Je suis en train de comprendre comment ajouter un DataTemplate au dictionnaire des ressources de l'application. Je connais la façon de le faire lorsque le DataTemplate est en XAML (via un uri), mais je suis un peu floue sur la façon de le faire lorsque le DataTemplate est défini dans le code.
Ce que j'ai, ce qui ne fonctionne pas est -
//Create DataTemplate
DataTemplate template = new DataTemplate(typeof(CoordinateViewModel));
FrameworkElementFactory ViewStack = new FrameworkElementFactory(typeof(CoordinateView));
ViewStack.Name = "myViewStack";
template.VisualTree = ViewStack;
ResourceDictionary dictionary = new ResourceDictionary();
dictionary.BeginInit();
dictionary.Add(template, template);
dictionary.EndInit();
App.Current.Resources.MergedDictionaries.Add(dictionary);
EDIT: Pour autant que je le DataTemplate ne fait pas dans le dictionnaire de ressources de l'application, en dépit de ne pas jeter des erreurs. Lorsque le ViewModel est appelé plus tard de XAML, il agit comme si il n'y a pas un bon DataTemplate pour l'afficher. Par exemple,
<StackPanel>
<ContentPresenter Content="{Binding ViewModel}" />
</StackPanel>
Résultats dans une fenêtre vide avec le texte « ShellPrototype.ViewModels.CoordinateViewModel » Affiché- EG, il ne dispose pas d'un modèle pour afficher la vue.
La solution
La clé ici, afin de rendre ce travail correctement, est d'utiliser DataTemplateKey :
ResourceDictionary dictionary = new ResourceDictionary();
dictionary.Add(new DataTemplateKey(typeof(CoordinateViewModel)), template);
Si vous faites cela, cela devrait fonctionner comme indiqué. Cependant, le FrameworkElementFactory est, selon la documentation , « une manière dépréciée pour créer des modèles programme », de sorte que vous pouvez analyser directement le XAML.