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:
Puis, je reconstruit un DataTemplate:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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(); }
avec
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;
Enfin, je construit mon HierarchicalDataTemplate:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Malheureusement, quand j'applique le HierarchicalDataTemplate via un template selector, le datatemplate ne s'applique pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;(seul le toggle button apparait).
En serializant le HierarchicalDataTemplate , j'obtient ceci:
Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
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>
Partager