Создание ресурса XAML из кода без ключа
-
02-07-2019 - |
Вопрос
Есть ли способ добавить ресурс в ResourceDictionary из кода, не предоставляя ему ключ ресурса?
Например, у меня есть этот ресурс в XAML:
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type xbap:FieldPropertyInfo}"
ItemsSource="{Binding Path=Value.Values}">
<TextBlock Text="{Binding Path=Name}" />
<HierarchicalDataTemplate>
</TreeView.Resources>
Мне нужно динамически создать этот ресурс из кода и добавить его в TreeView ResourceDictionary.Однако в XAML отсутствие ключа означает, что он используется по умолчанию для всех типов FieldPropertyInfo.Есть ли способ добавить его к ресурсу в коде без наличия ключа или есть способ, которым я могу использовать ключ и при этом использовать его для всех типов FieldPropertyInfo?
Вот что я уже сделал на C #:
HierarchicalDataTemplate fieldPropertyTemplate = new HierarchicalDataTemplate("FieldProperyInfo");
fieldPropertyTemplate.ItemsSource = new Binding("Value.Values");
this.Resources.Add(null, fieldPropertyTemplate);
Очевидно, что добавление ресурса в ResourceDictionary с ключом null не работает.
Решение
Используйте тип, к которому вы хотите применить шаблон, в качестве ключа:
HierarchicalDataTemplate fieldPropertyTemplate = new
HierarchicalDataTemplate("FieldProperyInfo");
fieldPropertyTemplate.SetBinding(
HierarchialDataTemplate.ItemSourceProperty,
new Binding("Value.Values");
this.Resources.Add(FieldPropertyInfo.GetType(), fieldPropertyTemplate);
Причина, по которой ваш код не работал, заключалась в вашем на самом деле мы не устанавливали привязку.Вам нужно вызвать SetBinding со свойством, к которому вы хотите привязать привязку.
Другие советы
Используйте тип, к которому вы хотите применить шаблон, в качестве ключа:
this.Resources.Add(FieldPropertyInfo.GetType(), fieldPropertyTemplate);
Как и в случае с вашим шаблоном выше, вы указываете тип.Вы должны либо указать имя, либо тип.