WPF树视图获取父节点的对象

时间:2014-02-12 12:41:59

标签: c# wpf treeview

我有一个具有以下结构的树视图:

Attribute1
  --Value11
  --Value12
Attribute2
  --Value21
  --...
...

树视图中填充了HierarchicalDataTemplate个自定义类AttributeValue

现在我需要获取当前所选项目(值)的父(属性)。

我尝试了什么:

DependencyObject obj = treeViewAttributes.ItemContainerGenerator.ContainerFromItem(treeViewAttributes.Items.CurrentItem);
DependencyObject parentNode = ((TreeViewItem)obj).Parent;
Attribute parentAttribute = treeViewAttributes.ItemContainerGenerator.ItemFromContainer(obj) as AttributeType;

但是第一行不检索所选对象,而是检索根节点。 ContainerFromItem(treeViewAttributes.SelectedItem)会返回null

4 个答案:

答案 0 :(得分:1)

WPF有理由不轻易返回树节点的父节点。它基本上迫使您根据逻辑与视觉表示来思考TreeView。树中的每个节点在逻辑上都包含一个对象,该对象在其自己的级别上始终在其子级之前创建,因此当您知道需要访问父节点时,最好的方法是引用父级中的父级。创建子项时的子项,因为父项已经存在。 这种方法比在搜索父级

时使用可视树更有效

答案 1 :(得分:0)

尝试以下代码

private void yourTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    if (sender is TreeView && ((TreeViewItem)((TreeView)sender).SelectedItem).Parent != null)
    {
        TreeViewItem parent = (TreeViewItem)((TreeViewItem)((TreeView)sender).SelectedItem).Parent;  // This will give you the parent             
    }
}

答案 2 :(得分:0)

我尝试运行treeView并使用GetHashCode查找父treeViewItem,它对我来说效果很好。我不知道表现如何,但我认为这应该不是问题:

private TreeViewItem GetParent(TreeViewItem root, TreeViewItem child)
    {
        //Step 1: Search at current level
        foreach (TreeViewItem item in root.Items)
        {
            if (item.GetHashCode() == child.GetHashCode())
            {
                return root;
            }
        }

        //Step 2: Still not found, so step deeper
        TreeViewItem buffer;
        foreach (TreeViewItem item in root.Items)
        {
            buffer = GetParent(item, child);
            if (buffer != null)
            {
                return buffer;
            }
        }

        //Not found anything
        return null;
    }

答案 3 :(得分:0)

使用此博客中的帮助程序类

https://rachel53461.wordpress.com/2011/10/09/navigating-wpfs-visual-tree/

    /// <summary>
    /// Returns the first ancester of specified type
    /// </summary>
    public static T FindAncestor<T>(DependencyObject current)
    where T : DependencyObject
    {
        current = VisualTreeHelper.GetParent(current);

        while (current != null)
        {
            if (current is T)
            {
                return (T)current;
            }
            current = VisualTreeHelper.GetParent(current);
        };
        return null;
    }

然后你可以通过这个电话获得父母

var parent = VisualTreeHelpers.FindAncestor<Attribute>(Value);