C# 如何从节点WPF树视图获取项目?
TreeView:C# 如何从节点WPF树视图获取项目?,c#,wpf,xaml,C#,Wpf,Xaml,TreeView: -MainNode -node0 data01 -data02 data021 data022 data03 -node1 data11 -node2 data21 事件选择改变 是否选择包含子节点的节点来获取最终数据 例如: 所选节点node0接收数据(data01、data021
-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数据,效果很好。我又增加了一个答案