Hierárquico DataTemplate com uma origem de dados XML problema com ligações
-
21-12-2019 - |
Pergunta
Com o XML seguinte abaixo, eu gostaria de usar um hierarchicaldatatemplate
com um treeview do WPF.
Dependendo do valor em tipo Eu pretendo usar uma imagem diferente com o nome ao lado e, em seguida, para obter o nome do valor a partir da etiqueta de identificação.
<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>
Eu tentei alguns exemplos simples mas nenhuma delas mostra como usar hierarchicaldatatemplate com atributos e também uma forma de a obter o texto com ligação de atributos.
Seria ótimo se alguém pudesse mostrar como a hierarchicaldatatemplate deve olhar como este XML para ser usado com um TreeView.
Solução
No começo, eu pensei que você não podia cumprir esses requisitos com o esquema XML.No entanto, depois de experimentá-la em um projeto de teste, parece que tudo funciona muito bem:
Você vai precisar usar um XmlDataProvider
para acessar o arquivo XML:
<XmlDataProvider Source="/WpfApplication2;component/Xml/TestXMLFile.xml"
XPath="root/key" />
Você também precisará adicionar um root
nó XML para torná-lo 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>
Em seguida, você precisa adicionar o TreeView
:
<TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource ItemTemplate}" />
E, finalmente, adicionar o HierarchicalDataTemplate
em seu Resources
seção:
<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>
Eu realmente não queria fazer a coisa toda para você, então eu vou deixar você para ajustá-lo ao seu gosto.Eu confio em você vai ficar bem aqui.