获取 WPF 中选定节点的父 TreeViewItem [英] Get parent TreeViewItem of a selected node in WPF

查看:40
本文介绍了获取 WPF 中选定节点的父 TreeViewItem的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想要一个被选为 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 而是返回 DependencyObjectItemsControl.

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 Tree Visualizer 显示树视图

这篇关于获取 WPF 中选定节点的父 TreeViewItem的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆