2009-05-07 15 views
7

TypeConverterを使用して任意のXMLドキュメントをWPF TreeViewにバインドしたいと思います。任意のXMLドキュメントをWPFにバインドするTreeView

私の元々の解決策は再帰を使用することでしたが、文書が大きい場合はUIが大きく縛られています。 TypeConverter程度が、特定のノード/要素の組み合わせのリンク会談後

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/edd843b7-b378-4c2d-926f-c053dbd7b340

どのように見えるかをXML文書知られていない場合はどう?これは表示用のものなので、この時点で機能については気にしません。XMLをTreeViewにバインドしたいだけです。

答えて

3

スキーマに関係なく、XMLドキュメントをツリービューにバインドする方法について質問しました。 1. XMLプロバイダとHierarchicalDataTemplateを使用してXMLドキュメントをWPF TreeViewにバインドします。 2.表示するには、次の形式で子ノードを持っているものを含むXMLドキュメントのすべてのノード:

>ノード1

ノード1の内容

>ChildNode1 

     ChildNode1 Contents 

      >ChildNode1'sChildNode 

       ChildNode1'sChildNode Contents 

> Node2の

Node2 Contents 

問題でした私のTreeViewは各XmlNodeの名前プロパティをTreeItemにバインドしていました。 XmlNodeというテキストの場合は#textを私が望んでいないTreeItemにバインドします。

だからMSDNフォーラムのポストを経由して、私は私の答えを得た: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cbdb2420-1403-436f-aa7f-b1e3b1acb398/

だから、トリックが発生したノードの種類に基づいて値を設定するためにトリガーを使用することでした。

注意:他のタイプのノードは無視され、XMLドキュメントには異なる要素が含まれている可能性があるため、発生したすべてのタイプのノードで機能しない可能性があります。それはいくつかの簡単な変更で他のノードタイプのために働く

<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

はここでXAMLです。まず、HierarchicalDataTemplate.ItemsSourceバインディング任意の子ノードと属性を許可するには、バインディングXPathを「child :: node()| attribute :: *」に変更する必要があります。次に、他のNodeTypeにDataTriggersを追加します。以下の例は私のために働いた。私は様々なNodeTypesのアイコンを追加し、あなたがそれらを削除する場合があります注:

 <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

は、次のスレッドに私の答えを見て持っている - 私は、これはあなたがfor.Theリンクを探している正確に何であるBinding XML data to WPF treeview Control信じますスレッドは、ソースコードをダウンロードするオプションを使用して、ステップバイステップの例を示すポストを指しています。この例は、のいずれかの XMLドキュメントをWPFツリービューにバインドするように記述されています。

関連する問題