Création d'une ressource XAML à partir de code sans clé
-
02-07-2019 - |
Question
Existe-t-il un moyen d’ajouter une ressource à un ResourceDictionary à partir de code sans lui attribuer de clé de ressource?
Par exemple, j'ai cette ressource en XAML:
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type xbap:FieldPropertyInfo}"
ItemsSource="{Binding Path=Value.Values}">
<TextBlock Text="{Binding Path=Name}" />
<HierarchicalDataTemplate>
</TreeView.Resources>
Je dois créer cette ressource de manière dynamique à partir de code et l'ajouter à TreeView ResourceDictionary. Toutefois, en l'absence de clé dans XAML, cela signifie qu'elle est utilisée par défaut pour tous les types FieldPropertyInfo. Existe-t-il un moyen de l'ajouter à la ressource dans le code sans avoir de clé ou existe-t-il un moyen d'utiliser une clé tout en conservant son utilisation dans tous les types FieldPropertyInfo?
Voici ce que j'ai déjà fait en C #:
HierarchicalDataTemplate fieldPropertyTemplate = new HierarchicalDataTemplate("FieldProperyInfo");
fieldPropertyTemplate.ItemsSource = new Binding("Value.Values");
this.Resources.Add(null, fieldPropertyTemplate);
Évidemment, l'ajout d'une ressource au ResourceDictionary, la clé null ne fonctionne pas.
La solution
Utilisez le type auquel vous souhaitez que le modèle s'applique en tant que clé:
HierarchicalDataTemplate fieldPropertyTemplate = new
HierarchicalDataTemplate("FieldProperyInfo");
fieldPropertyTemplate.SetBinding(
HierarchialDataTemplate.ItemSourceProperty,
new Binding("Value.Values");
this.Resources.Add(FieldPropertyInfo.GetType(), fieldPropertyTemplate);
La raison pour laquelle votre code ne fonctionnait pas était que votre n'établissait pas réellement la liaison . Vous devez appeler SetBinding avec la propriété à laquelle vous souhaitez que la liaison soit liée.
Autres conseils
Utilisez le type auquel vous souhaitez que le modèle s'applique en tant que clé:
this.Resources.Add(FieldPropertyInfo.GetType(), fieldPropertyTemplate);
Comme pour votre modèle ci-dessus, vous fournissez un type. Vous devez soit fournir un nom, soit un type.