C# 如何从节点WPF树视图获取项目?

C# 如何从节点WPF树视图获取项目?,c#,wpf,xaml,C#,Wpf,Xaml,TreeView: -MainNode -node0 data01 -data02 data021 data022 data03 -node1 data11 -node2 data21 事件选择改变 是否选择包含子节点的节点来获取最终数据 例如: 所选节点node0接收数据(data01、data021

TreeView:

   -MainNode
      -node0
          data01
          -data02
             data021
             data022
          data03
      -node1
          data11
      -node2
          data21
事件选择改变

是否选择包含子节点的节点来获取最终数据

例如:
所选节点node0接收数据(data01、data021、data022、data03)

我将使用一个简单的递归来获得您想要的。伪代码如下:

私有列表递归\u方法(节点选择节点){

列表数据=新列表();
foreach(节点列表中的子节点。子节点){
数据。添加(子项);
列表子项=递归_方法(子项);
if(children!=null)data.addRange(children);
}
返回数据;

}

我会使用一个简单的递归来得到您想要的。伪代码如下:

私有列表递归\u方法(节点选择节点){

列表数据=新列表();
foreach(节点列表中的子节点。子节点){
数据。添加(子项);
列表子项=递归_方法(子项);
if(children!=null)data.addRange(children);
}
返回数据;

}

我假设你是什么这是什么: 单击顶级节点(node0、node1、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>

用于处理SelectedItemChanged事件的cs代码如下所示

    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);
        }
    }
private void myTreeView\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
foreach((TreeViewItem)e.NewValue.Items中的TreeViewItem数据节点)
{
TraverseChildrenData(数据节点);
}
}
公共void TraverseChildrenData(TreeViewItem TreeViewItem)
{
//在此处对子数据项执行任何操作。。
Show(treeViewItem.Header.ToString());
foreach(TreeViewItem.Items中的TreeViewItem子项)
{
TraverseChildrenData(子级);
}
}

我假设你是什么这是什么: 单击顶级节点(node0、node1、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>

用于处理SelectedItemChanged事件的cs代码如下所示

    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);
        }
    }
private void myTreeView\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
foreach((TreeViewItem)e.NewValue.Items中的TreeViewItem数据节点)
{
TraverseChildrenData(数据节点);
}
}
公共void TraverseChildrenData(TreeViewItem TreeViewItem)
{
//在此处对子数据项执行任何操作。。
Show(treeViewItem.Header.ToString());
foreach(TreeViewItem.Items中的TreeViewItem子项)
{
TraverseChildrenData(子级);
}
}

这是我先前答案的更改版本。这一个使用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:


政务司司长:

private void myTreeView\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
foreach((xmlement)e.NewValue.ChildNodes中的xmlement数据节点)
{
TraverseChildrenData(数据节点);
}
}
公共void TraverseChildrenData(XmlElement treeViewItem)
{
//在此处对子数据项执行任何操作。。
MessageBox.Show(treevieItem.Attributes[“Header”].Value);
foreach(treeViewItem.ChildNodes中的XmlElement子节点)
{
TraverseChildrenData(子级);
}
}

这是我先前答案的更改版本。这一个使用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:


政务司司长:

private void myTreeView\u SelectedItemChanged(对象发送方,RoutedPropertyChangedEventArgs e)
{
foreach((xmlement)e.NewValue.ChildNodes中的xmlement数据节点)
{
TraverseChildrenData(数据节点);
}
}
公共void TraverseChildrenData(XmlElement treeViewItem)
{
//在此处对子数据项执行任何操作。。
MessageBox.Show(treevieItem.Attributes[“Header”].Value);
foreach(treeViewItem.ChildNodes中的XmlElement子节点)
{
TraverseChildrenData(子级);
}
}

要从节点结构获取IEnumerable,我发现本文非常有用

它使用扩展方法,您可以获得可重用性和延迟执行的所有好处

用法示例:

IEnumerable<XmlElement> nodes = treeViewItem.AsBreadthFirstEnumerable(x => x.ChildNodes);
IEnumerable nodes=treevieItem.AsBreadthFirstEnumerable(x=>x.ChildNodes);

要从节点结构获取IEnumerable,我发现本文非常有用

它使用扩展方法,您可以获得可重用性和延迟执行的所有好处

用法示例:

IEnumerable<XmlElement> nodes = treeViewItem.AsBreadthFirstEnumerable(x => x.ChildNodes);
IEnumerable nodes=treevieItem.AsBreadthFirstEnumerable(x=>x.ChildNodes);

treeview的xaml是什么样子的?您是将ItemsSource绑定到数据结构还是手动创建TreeViewItems?ItemsSource__________________________您的treeview的xaml是什么样子的?您是将ItemsSource绑定到数据结构还是手动创建TreeViewItems?ItemsSource__________________________我尝试将TreeView的ItemSource绑定到XML数据,效果很好。我又增加了一个答案