Creation d'un HierarchicalDataTemplate à partir de TreeViewItem
Bonjour,
J'aimerais créer un HierarchicalDataTemplate par code à partir d'une instance de TreeViewItem (la source de données du TreeView est un fichier XML).
L'idée c'est qu'après avoir modifié les propriétés graphiques d'un TreeViewItem (via une PropertyGrid) on mémorise le template pour l'appliquer plus tard dans un TreeView.
Dans un premier temps je serialize dans une string l'object TreeViewItem:
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
StringBuilder xamlString = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
using (XmlWriter xmlWriter = XmlWriter.Create(xamlString, settings))
{
XamlDesignerSerializationManager dsm = new XamlDesignerSerializationManager(xmlWriter);
dsm.XamlWriterMode = XamlWriterMode.Expression;
XamlWriter.Save(myTreeViewItem, dsm);
xmlWriter.Flush();
} |
Puis, je reconstruit un DataTemplate:
Code:
1 2 3 4 5 6
|
StringBuilder dataTemplateXaml = new StringBuilder();
dataTemplateXaml.Append("<DataTemplate>\n");
dataTemplateXaml.Append(xamlString.ToString());
dataTemplateXaml.Append("\n</DataTemplate>");
DataTemplate template = GetObject(dataTemplateXaml.ToString()) as DataTemplate; |
avec
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
public static Object GetObject(string xaml)
{
MemoryStream stream = null;
stream = new MemoryStream(Encoding.ASCII.GetBytes(xaml));
ParserContext parserContext = new ParserContext();
parserContext.XmlnsDictionary.Add("", "http://schemas.microsoft.com/winfx/2006/xaml/presentation");
parserContext.XmlnsDictionary.Add("x", "http://schemas.microsoft.com/winfx/2006/xaml");
return XamlReader.Load(stream, parserContext);
} |
Enfin, je construit mon HierarchicalDataTemplate:
Code:
1 2 3 4 5 6 7
|
HierarchicalDataTemplate hierarchicaltemplate = new HierarchicalDataTemplate(typeof(TreeViewItem));
hierarchicaltemplate.ItemTemplate = template;
Binding itemsSourceBinding = new Binding();
itemsSourceBinding.XPath = "child::node()|attribute::*";
hierarchicaltemplate.ItemsSource = itemsSourceBinding; |
Malheureusement, quand j'applique le HierarchicalDataTemplate via un template selector, le datatemplate ne s'applique pas :cry: (seul le toggle button apparait).
En serializant le HierarchicalDataTemplate , j'obtient ceci:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
<HierarchicalDataTemplate DataType="Folder">
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TreeViewItem Background="Blue">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding XPath=@Header}" />
</StackPanel>
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate> |