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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top