Plantilla de datos jerárquica con un problema de fuente de datos XML con enlaces
-
21-12-2019 - |
Pregunta
Con el siguiente XML a continuación me gustaría usar un hierarchicaldatatemplate
con una vista de árbol de WPF.
Dependiendo del valor en tipo Tengo la intención de usar imágenes diferentes con el nombre al lado y luego obtener el nombre del valor de la etiqueta de identificación.
<key type='Configuration'>
<id field='name' value='Some value'/>
</key>
<key type='Container'>
<id field='name' value='MyName'/>
<key type='Container'>
<id field='name' value='Data12345'/>
<key type='Container'>
<id field='name' value='Data987655'/>
<key type='Circuit'>
<id field='name' value='Data63236723'/>
</key>
</key>
</key>
</key>
He probado algunos de los ejemplos simples, pero ninguno muestra cómo usar la plantilla de datos jerárquica con atributos y también cómo obtener el texto con enlace de los atributos.
Sería fantástico si alguien pudiera mostrar cómo debería verse la plantilla de datos jerárquica para que este XML se use con un TreeView.
Solución
Al principio pensé que no se podían cumplir esos requisitos con ese esquema XML.Sin embargo, después de probarlo en un proyecto de prueba, parece que todo funciona bien:
Necesitará usar un XmlDataProvider
para acceder al archivo XML:
<XmlDataProvider Source="/WpfApplication2;component/Xml/TestXMLFile.xml"
XPath="root/key" />
También necesitarás agregar un root
nodo al XML para hacerlo legal:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<key type='Configuration'>
<id field='name' value='Some value'/>
</key>
<key type='Container'>
<id field='name' value='MyName'/>
<key type='Container'>
<id field='name' value='Data12345'/>
<key type='Container'>
<id field='name' value='Data987655'/>
<key type='Circuit'>
<id field='name' value='Data63236723'/>
</key>
</key>
</key>
</key>
</root>
Entonces necesitas agregar el TreeView
:
<TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource ItemTemplate}" />
Y finalmente, agregue el HierarchicalDataTemplate
en tu Resources
sección:
<HierarchicalDataTemplate x:Key="ItemTemplate" ItemsSource="{Binding XPath=key}" DataType="key">
<StackPanel Orientation="Horizontal" Margin="0,2">
<Image>
<Image.Style>
<Style>
<Setter Property="Image.Source" Value="Images/Default.png" />
<Style.Triggers>
<DataTrigger Binding="{Binding XPath=@type}" Value="Container">
<Setter Property="Image.Source" Value="Images/Container.png" />
</DataTrigger>
<DataTrigger Binding="{Binding XPath=@type}" Value="Configuration">
<Setter Property="Image.Source" Value="Images/Configuration.png" />
</DataTrigger>
<DataTrigger Binding="{Binding XPath=@type}" Value="Circuit">
<Setter Property="Image.Source" Value="Images/Circuit.png" />
</DataTrigger>
</Style.Triggers>
</Style>
</Image.Style>
</Image>
<TextBlock Text="{Binding XPath=id/@value}" Margin="5,0" />
</StackPanel>
</HierarchicalDataTemplate>
Realmente no quise hacer todo por ti, así que te dejaré que lo modifiques a tu gusto.Confío en que estarás bien desde aquí.