2009-05-07 8 views
7

Vorrei associare qualsiasi documento XML a TreeView WPF utilizzando TypeConverter.Associare qualsiasi documento XML a WPF TreeView

La mia soluzione originale era usare la ricorsione, ma quando il documento è grande l'interfaccia utente è pesantemente legata.

seguente link parla TypeConverter ma per particolare combinazione nodo/elemento: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/edd843b7-b378-4c2d-926f-c053dbd7b340

Cosa succede se non sa quale documento XML assomiglia? Dato che questo è solo a scopo di visualizzazione, non mi interessa molto della funzionalità, a questo punto voglio solo associare XML a TreeView.

risposta

3

Quindi ho chiesto una domanda su come associare qualsiasi documento XML indipendentemente dallo schema alla vista ad albero nel modo seguente: 1. Associare il documento XML a WPF TreeView tramite provider XML e HierarchicalDataTemplate. 2. Visualizzare tutti i nodi del documento XML, compresi quelli che hanno nodi figlio in seguente formato:

> Node1

Node1 Contenuto

>ChildNode1 

     ChildNode1 Contents 

      >ChildNode1'sChildNode 

       ChildNode1'sChildNode Contents 

> Nodo2

Node2 Contents 

Il problema era che il mio TreeView legava ogni proprietà del nome XmlNode a TreeItem. In caso di testo XmlNode, si collegherebbe #text a TreeItem che non era quello che volevo.

Quindi tramite un post su MSDN forum ho avuto la mia risposta: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cbdb2420-1403-436f-aa7f-b1e3b1acb398/

Quindi il trucco è stato quello di utilizzare i trigger per impostare il valore in base al tipo di nodo incontrato.

L'avvertenza è che altri tipi di nodi verranno ignorati e il documento XML potrebbe contenere elementi diversi, pertanto potrebbe non funzionare per ogni tipo di nodo rilevato.

Ecco XAML:

<Window x:Class="WpfApplication1.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication1" 
    Title="Window1" Height="250" Width="450"> 

<Window.Resources> 
    <HierarchicalDataTemplate x:Key="NodeTemplate"> 
     <TextBlock x:Name="text" Text="?" /> 
     <HierarchicalDataTemplate.ItemsSource> 
      <Binding XPath="child::node()" /> 
     </HierarchicalDataTemplate.ItemsSource> 
     <HierarchicalDataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
       <Setter TargetName="text" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
       <Setter TargetName="text" Property="Text" Value="{Binding Path=Name}"></Setter> 
      </DataTrigger> 
     </HierarchicalDataTemplate.Triggers>    
    </HierarchicalDataTemplate> 
    <XmlDataProvider x:Key="xmlDataProvider"></XmlDataProvider> 
</Window.Resources> 

<Grid > 
    <TreeView Name="treeView1" 
       Background="AliceBlue" 
       ItemsSource="{Binding Source={StaticResource xmlDataProvider}, XPath=*}" 
       ItemTemplate= "{StaticResource NodeTemplate}"/> 
</Grid> 

public Window1() 
{ 
InitializeComponent(); 
XmlDataProvider dataProvider = this.FindResource("xmlDataProvider") as XmlDataProvider; 
     XmlDocument doc = new XmlDocument(); 
      // Testdocument  doc.LoadXml(
      @"<root> 
       <child1>text1<child11>text11</child11> 
       </child1> 
       <child2>text2<child21>text21</child21> 
        <child22>text22</child22> 
       </child2> 
       </root>"); 
     dataProvider.Document = doc; 
    } 
6

Si lavora per altri tipi di nodo con poche semplici modifiche. Innanzitutto, HierarchicalDataTemplate.ItemsSource Binding XPath deve essere modificato in "child :: node() | attribute :: *" per consentire qualsiasi nodo figlio e qualsiasi attributo. Quindi, aggiungi DataTriggers per altri NodeTypes. L'esempio qui sotto ha funzionato per me. NOTA che ho aggiunto le icone per le varie NodeTypes, si potrebbe desiderare di rimuoverli:

 <HierarchicalDataTemplate x:Key="NodeTemplate"> 
     <StackPanel Orientation="Horizontal"> 
     <Image x:Name="icon" VerticalAlignment="Center" Margin="1,1,4,1"/> 
     <TextBlock x:Name="name" Text="" /> 
     <TextBlock x:Name="inter" Text="" /> 
     <TextBlock x:Name="value" Text="" /> 
     </StackPanel> 
     <HierarchicalDataTemplate.ItemsSource> 
      <Binding XPath="child::node()|attribute::*" /> 
     </HierarchicalDataTemplate.ItemsSource> 
     <HierarchicalDataTemplate.Triggers> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Element"> 
       <Setter TargetName="icon" Property="Source" Value="icons/element.png"></Setter> 
       <Setter TargetName="name" Property="Text" Value="{Binding Path=Name}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Text"> 
       <Setter TargetName="icon" Property="Source" Value="icons/text.png"></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Attribute"> 
       <Setter TargetName="icon" Property="Source" Value="icons/attribute.png"></Setter> 
       <Setter TargetName="name" Property="Text" Value="{Binding Path=Name}"></Setter> 
       <Setter TargetName="inter" Property="Text" Value=": "></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="CDATA"> 
       <Setter TargetName="icon" Property="Source" Value="icons/cdata.png"></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="Comment"> 
       <Setter TargetName="icon" Property="Source" Value="icons/comment.png"></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
      <DataTrigger Binding="{Binding Path=NodeType}" Value="ProcessingInstruction"> 
       <Setter TargetName="icon" Property="Source" Value="icons/pi.png"></Setter> 
       <Setter TargetName="value" Property="Text" Value="{Binding Path=Value}"></Setter> 
      </DataTrigger> 
     </HierarchicalDataTemplate.Triggers> 
    </HierarchicalDataTemplate> 
1

Dai un'occhiata alla mia risposta su questo thread - Binding XML data to WPF treeview Control Credo che questo è esattamente quello che stai cercando collegamento for.The in il thread punta a un post che fornisce un esempio passo per passo con un'opzione per scaricare il codice sorgente. L'esempio è scritto in modo tale da collegare a qualsiasi documento XML a una vista ad albero WPF