我有一个具有以下结构的树视图:
Attribute1
--Value11
--Value12
Attribute2
--Value21
--...
...
树视图中填充了HierarchicalDataTemplate
个自定义类Attribute
和Value
。
现在我需要获取当前所选项目(值)的父(属性)。
我尝试了什么:
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
。
答案 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);