TreeViewItem.ParentTreeViewItem 是内部的,但有办法获得它吗?

TreeViewItem.ParentTreeViewItem is internal but is there a way to get it?

我正在尝试编写可以接受 Key.DownKey.Up 的代码,并更改使用多个 HierarchicalDataTemplateTreeView 的选择。在 TreeViewItem 的子节点中,我需要获取其父节点,以便确定下一个节点应该被选中。我注意到 TreeViewItem 有一个 ParentTreeViewItem 属性,但它设置为内部,因此无法访问。是否有另一种方法来模拟如何将 TreeViewItem 的父级作为 TreeViewItem?注意:使用 HierarchicalDataTemplate 时,Parent 始终为空。提前致谢。

使用TreeViewItem.Parent 属性,如果parent属性为null,表示没有父节点

 <TreeView>
      <TreeViewItem Header="root">
            <TreeViewItem Header="child" Name="child_item"></TreeViewItem>
      </TreeViewItem>
 </TreeView>

您始终可以使用 VisualTreeHelper.GetParent 查找任何父元素:

private bool TryGetVisualParent<TParent>(DependencyObject element, out TParent parent) where TParent : DependencyObject
{
  parent = null;

  if (element is null)
  {
    return false;
  }

  element = VisualTreeHelper.GetParent(element);
  if (element is TParent parentElement)
  {
    parent = parentElement;
    return true;
  }

  return TryGetVisualParent(element, out parent);
}

用法示例

private void OnTreeViewItem_Selcted(object sender, RoutedEventArgs e)
{
  var selectedItem = e.OriginalSource as TreeViewItem;
  if (TryGetVisualParent(selectedItem, out TreeViewItem parentItem))
  {
    // Handle 'parentItem'
  }
}