获取 WPF 中选定节点的父 TreeViewItem [英] Get parent TreeViewItem of a selected node in WPF
问题描述
我想要一个被选为 TreeViewItem 的节点的父节点
I want the parent of a node that is selected as TreeViewItem
我有一个包含 2 个字段的 Person 类.名称(字符串)和子项(字符串列表)
I have a Person class with 2 fields. Name(String) and Children(List of string)
这是我的xaml代码
<Grid x:Name="gridView" Margin="10">
<TreeView Name="treeView1" TreeViewItem.Selected="TreeViewItem_OnItemSelected" ItemsSource="{Binding}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsSelected" Value="{Binding IsSelected, Source=Check, Mode=TwoWay}" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type loc:Person}" ItemsSource="{Binding Children}" >
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
这是我背后的代码.我将项目源设置为 Person 对象列表.
this is my code behind. I set the item source to a list of Person objects.
void set()
{
if (treeView1.Items.IndexOf(treeView1.SelectedItem) != -1)
{
//is a parent
//returns -1 for children
Person selected = (Person)treeView1.SelectedItem;
int index = search(selected);
TreeViewItem parent = treeView1.Tag as TreeViewItem;
setSelected(parent,index);
}
else
{
//is a child
TreeViewItem child = treeView1.Tag as TreeViewItem; //returns the selected node
TreeViewItem parent = child.Parent as TreeViewItem; //returns null
}
}
private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
{
treeView1.Tag = e.OriginalSource;
int ind = 0;
foreach (var _item in treeView1.Items)
{
if (_item == treeView1.SelectedItem)
{
selectedIndex = ind;
break;
}
ind++;
}
}
在 else 部分,child.Parent
总是返回 null.我尝试了其他方法,但没有一个返回 TreeViewItem
而是返回 DependencyObject
或 ItemsControl
.
In the else part, The child.Parent
always returns null. I tried other methods but none of them return a TreeViewItem
instead they return DependencyObject
or ItemsControl
.
我也尝试过 ContainerFromItem
方法,但它只适用于直接子级(父级),而不适用于父级的子级.
I also tried ContainerFromItem
method but it only works for direct children(parent) and not the children of the parent.
请帮忙
推荐答案
您可以使用 VisualTreeHelper.GetParent()
方法:https:///msdn.microsoft.com/de-de/library/system.windows.media.visualtreehelper.getparent(v=vs.110).aspx
示例代码:
private TreeViewItem FindParentTreeViewItem(object child)
{
try
{
var parent = VisualTreeHelper.GetParent(child as DependencyObject);
while ((parent as TreeViewItem) == null)
{
parent = VisualTreeHelper.GetParent(parent);
}
return parent as TreeViewItem;
}
catch (Exception e)
{
//could not find a parent of type TreeViewItem
return null;
}
}
需要 while 循环,因为树视图项的视觉父项不是其父树视图项,如在此 WPF Tree Visualizer 中所示:
The while loop is needed, as the visual parent of a tree view item isn't its parent tree view item as can be seen in this WPF Tree Visualizer:
这篇关于获取 WPF 中选定节点的父 TreeViewItem的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!