2010-09-10 39 views
0

的TreeView:如何從節點WPF treeview中獲取項目?

-MainNode 
     -node0 
      data01 
      -data02 
      data021 
      data022 
      data03 
     -node1 
      data11 
     -node2 
      data21 

事件SelectedChange;

作爲包含子節點以獲取最終數據的節點的選擇?

例如: 選擇的節點NODE0接收數據(DATA01,data021,data022,DATA03)

+0

什麼是你的樹視圖中的XAML是什麼樣子?你將ItemsSource綁定到數據結構還是手動創建TreeViewItems? – Bubblewrap 2010-09-10 08:21:50

+0

ItemsSource!__________________________ – Keepq 2010-09-10 08:32:26

回答

1

我會使用一個簡單的遞歸來得到你想要的。下面的僞代碼:

私人列表recursive_method(節點selectedNode){

List<Node> data = new List<Node>(); 

foreach(child in nodelist.Children) { 
    data.add(child); 
    List<Node> children = recursive_method(child); 
    if(children != null) data.addRange(children); 
} 

return data; 

}

2

我假設你這是什麼東西: 在頂級節點(NODE0,節點1的點擊, node2),我想獲取樹中的所有子數據節點。

如果這是你需要什麼,下面的代碼:

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <TreeView x:Name="myTreeView" Height="271" HorizontalAlignment="Left" Margin="47,12,0,0" VerticalAlignment="Top" Width="236" SelectedItemChanged="myTreeView_SelectedItemChanged"> 
     <TreeViewItem Header="node0" > 
      <TreeViewItem Header="data01" /> 
      <TreeViewItem Header="data02" > 
       <TreeViewItem Header="data021" /> 
       <TreeViewItem Header="data022" /> 
      </TreeViewItem> 
      <TreeViewItem Header="data03" /> 
     </TreeViewItem> 
     <TreeViewItem Header="node1" > 
      <TreeViewItem Header="data11" /> 
     </TreeViewItem> 
     <TreeViewItem Header="node2" > 
      <TreeViewItem Header="data21" /> 
     </TreeViewItem> 
    </TreeView> 
</Grid> 
</Window> 

和CS後面的代碼來處理SelectedItemChanged事件看起來像這樣

private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     foreach (TreeViewItem dataNode in ((TreeViewItem)e.NewValue).Items) 
     { 
      TraverseChildrenData(dataNode); 
     } 
    } 

    public void TraverseChildrenData(TreeViewItem treeViewItem) 
    { 
     //do whatever you want to do with child data item here.. 
     MessageBox.Show(treeViewItem.Header.ToString()); 

     foreach (TreeViewItem child in treeViewItem.Items) 
     { 
      TraverseChildrenData(child); 
     } 
    } 
+0

請注意,如果綁定到ItemsSource,這將不起作用。 – Bubblewrap 2010-09-10 08:20:11

+0

我試着將TreeView的ItemSource綁定到XML數據,它工作正常。我添加了一個使用ItemsSource的答案。請讓我知道,如果這看起來不錯,或者我錯過了什麼 – 2010-09-10 09:14:10

0

這裏有一個變化的版本我剛纔的回答。這一次使用TreeView的ItemsSource時將數據綁定

XML數據:

<data> 
    <datanode Header="node0" > 
    <datanode Header="data01" /> 
    <datanode Header="data02" > 
     <datanode Header="data021" /> 
     <datanode Header="data022" /> 
    </datanode> 
    <datanode Header="data03" /> 
    </datanode> 
    <datanode Header="node1" > 
    <datanode Header="data11" /> 
    </datanode> 
    <datanode Header="node2" > 
    <datanode Header="data21" /> 
    </datanode> 
</data> 

XAML:

<Grid> 
    <Grid.DataContext> 
     <XmlDataProvider Source="Data.xml" XPath="/data/datanode" /> 
    </Grid.DataContext> 
    <TreeView x:Name="myTreeView" Height="271" HorizontalAlignment="Left" Margin="47,12,0,0" VerticalAlignment="Top" Width="236" SelectedItemChanged="myTreeView_SelectedItemChanged" ItemsSource="{Binding}" > 
     <TreeView.ItemTemplate> 
      <HierarchicalDataTemplate ItemsSource="{Binding}" > 
        <TextBlock Text="{Binding [email protected]}" /> 
      </HierarchicalDataTemplate> 
     </TreeView.ItemTemplate> 
    </TreeView> 
</Grid> 

CS:

private void myTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     foreach (XmlElement dataNode in ((XmlElement)e.NewValue).ChildNodes) 
     { 
      TraverseChildrenData(dataNode); 
     } 
    } 

    public void TraverseChildrenData(XmlElement treeViewItem) 
    { 
     //do whatever you want to do with child data item here.. 
     MessageBox.Show(treeViewItem.Attributes["Header"].Value); 

     foreach (XmlElement child in treeViewItem.ChildNodes) 
     { 
      TraverseChildrenData(child); 
     } 
    }