Mi piacerebbe visualizzare l'XML arbitrario in un TreeView, con nodi espandibili e collassabili, mostrando sia il nome dell'elemento che l'insieme di attributi e i loro valori. Penso di poterlo fare con HierarchicalDataTemplate.Come posso utilizzare HierarchicalDataTemplate per visualizzare gli elementi e gli attributi XML?
Ho visto i suggerimenti per utilizzare HierarchicalDataTemplate per visualizzare XML arbitrario elementi, e nodi di testo, come questo:
<Window.Resources>
<HierarchicalDataTemplate x:Key="NodeTemplate">
<TextBlock x:Name="tbName" Text="?" />
<HierarchicalDataTemplate.ItemsSource>
<Binding XPath="child::node()" />
</HierarchicalDataTemplate.ItemsSource>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
<Setter TargetName="tbName" Property="Text" Value="{Binding Path=Value}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
<Setter TargetName="tbName" Property="Text" Value="{Binding Path=Name}"/>
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
<XmlDataProvider x:Key="xmlDataProvider">
</XmlDataProvider>
</Window.Resources>
....
<TreeView Name="treeView1"
ItemsSource="{Binding Source={StaticResource xmlDataProvider}, XPath=*}"
ItemTemplate= "{StaticResource NodeTemplate}"/>
Il che funziona alla grande. Visualizza i nomi degli elementi e il testo per ciascun elemento. Ma il mio XML utilizza attributi per trasportare informazioni. Lo schema è complesso e non ho una definizione formale di esso, quindi per ora lo sto trattando come XML arbitrario.
Il documento più semplice è simile al seguente:
<c4soap name="GetVersionInfo" seq="" result="1">
<versions>
<version name="Director"
version="2.1.0.126418"
buildtype=""
builddate="Jun 1 2011" buildtime="14:52:43" />
<version name="MediaManager"
version="2.1.0.126418"
buildtype=""
builddate="Jun 1 2011"
buildtime="14:36:17" />
</versions>
</c4soap>
Usando la definizione HierarchicalDataTemplate sopra, ottengo questo per una visualizzazione:
Non è proprio quello che voglio. Per ciascun nodo, desidero visualizzare sia il nome dell'elemento e l'insieme di attributi e i relativi valori.
ho provato questo:
<Window.Resources>
<HierarchicalDataTemplate x:Key="NodeTemplate">
<WrapPanel
Focusable="False">
<TextBlock x:Name="tbName" Text="?" />
<TextBlock x:Name="tbAttrs" Text="?" />
</WrapPanel>
<HierarchicalDataTemplate.ItemsSource>
<Binding XPath="child::node()" />
</HierarchicalDataTemplate.ItemsSource>
<HierarchicalDataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=NodeType}" Value="Text">
<Setter TargetName="tbName" Property="Text" Value="{Binding Path=Value}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=NodeType}" Value="Element">
<Setter TargetName="tbName" Property="Text" Value="{Binding Path=Name}"/>
<Setter TargetName="tbAttrs" Property="Text" Value="{Binding Path=Attributes}"/>
</DataTrigger>
</HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>
<XmlDataProvider x:Key="xmlDataProvider">
</XmlDataProvider>
</Window.Resources>
... che mi fa un pò stretta, ma i Value="{Binding Path=Attributes}"
risultati in un display di "(Collection)" nel controllo TreeView.
Come posso semplicemente visualizzare tutti i nomi degli attributi reali e valori, oltre al nome dell'elemento?
U potrebbe condividere codice finale per favore? (+1 c'è) :) –