在 WPF C# TreeView 中获取子节点的父节点

12

我了解在使用WPF的C#编程与传统的C#过程有所不同,因此大部分在线材料并未提到我需要的内容。

我在我的WPF窗口中有一个TreeView控件,其中包含父节点和子节点。我想将它们存储在一个类型为Node(id、name、parent)的列表中。

enter image description here

我使用以下代码获取选定项/节点的名称:

private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
{
    TreeViewItem item = treeView.SelectedItem as TreeViewItem;
    nameTxt.Text = item.Header.ToString();
}

我尝试使用以下方法获取它之前的子节点的父节点:

And I tried getting the Parent of the child node immediately before it using this:

(T)
TreeViewItem item = treeView.SelectedItem as TreeViewItem;
nameTxt.Text = item.Parent.ToString();

然而,这将返回根父级元素(A),而非该子元素的父级元素(即2)。

应该进行哪些更改以获取子元素的直接父级元素而不是根父级元素? :)

编辑:以下是 XAML 代码:

<TreeView Name="treeView" HorizontalAlignment="Left" Height="564" Margin="10,68,0,0" VerticalAlignment="Top" Width="363">
     <TreeViewItem TreeViewItem.Selected="TreeViewItem_OnItemSelected"  Header="A" IsExpanded="True" Height="554" FontSize="18">
                <TreeViewItem Header="1" />
                <TreeViewItem Header="2" />
     </TreeViewItem>
</TreeView>

这很不寻常,返回的是节点的父节点而不是 Parent 属性。你能否展示一段扩展版本的代码,也许问题出在其他地方。 - Christo S. Christov
当item.Parent返回A时,SelectedItem是什么? - Sriram Sakthivel
@Chris 这是完整的代码,伙计。我只是将所选项目和其父项打印到文本框中。它一直映射到根节点 A。但是所选项目显示当前选定的项目,只是父项一直被映射到根节点而不是紧接在前的父项。 - MWUser
@SriramSakthivel,请参考上面的评论,先生! :) - MWUser
@Chris 我把我的 XML 加到问题里了。 - MWUser
1
你的Xaml文件并不反映出图像中显示的UI,你只有两个父节点是A,所以你得到的是A。我也无法重现这个问题。发完整的代码来重现问题以获得帮助。顺便说一句,我建议你使用数据绑定而不是引用 这里 - Sriram Sakthivel
1个回答

27

我创建了一个小例子来演示你的问题

MainWindow.xaml

 <TreeView Name="tree">
    <TreeView>
        <TreeViewItem Header="North America" Selected="TreeViewItem_OnItemSelected">
            <TreeViewItem Header="USA">
                <TreeViewItem Header="New York"/>
                <TreeViewItem Header="Las Vegas"/>
                <TreeViewItem Header="Washington"/>
            </TreeViewItem>
            <TreeViewItem Header="Canada">
                <TreeViewItem Header="Toronto"/>
                <TreeViewItem Header="Quebec"/>
                <TreeViewItem Header="Montreal"/>
            </TreeViewItem>
            <TreeViewItem Header="Mexico"></TreeViewItem>
        </TreeViewItem>
    </TreeView>
</TreeView>

在代码后端即MainWindow.xaml.cs

 private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
    {
        TreeViewItem item = e.OriginalSource as TreeViewItem;
        if (item != null)
        {
            ItemsControl parent = GetSelectedTreeViewItemParent(item);

            TreeViewItem treeitem = parent as TreeViewItem;
            string MyValue= treeitem .Header.ToString();//Gets you the immediate parent
        }
    }
    public ItemsControl GetSelectedTreeViewItemParent(TreeViewItem item)
    {
        DependencyObject parent = VisualTreeHelper.GetParent(item);
        while (!(parent is TreeViewItem || parent is TreeView))
        {
            parent = VisualTreeHelper.GetParent(parent);
        }

        return parent as ItemsControl;
    }

完成了。


太棒了!这个方法有效啊,兄弟!非常感谢你花时间来进行演示。祝你有一个愉快的一天,Kyle! - MWUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接