2010-09-10 38 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); 
     } 
    }