C# WPF 从 TreeView 中的子项/父项中删除单个子项

问题描述 投票:0回答:1

我在 WPF 中设置了一个静态(暂时)树。我试图从父项中删除特定的子项,这是 main 的子项,但不确定如何进行。树的结构如下:

tree example

我有一个删除按钮,其中的 Click 事件编写如下:

private void TreeView_Selected_Delete(object sender, RoutedEventArgs e)
    {
        MainTestList.Items.Remove(MainTestList.SelectedItem);
    }

但是,这只能删除“主”项,或根/根父项

只是为了尝试,我也尝试使用

MainTestList.Items.RemoveAt(MainTestList.Items.IndexOf(MainTestList.SelectedItem));

但是效果是一样的,除了抛出一个异常

System.ArgumentOutOfRangeException: 'removeIndex is less than zero or greater than or equal to Count. (Parameter 'index')' 

我的理解是,TreeView 是项目的索引,但是其中的任何项目都有自己的索引,因此上面的方法不起作用,因为索引对于相关项目来说是错误的。因此,如果 TreeView 中的每个 Item 内部有任何子项,则它就是一个 Parent(Main 是 submenu2 的父项,submenu2_2 是 submenu2_2 的父项,submenu2_2 是 deepitem 子项的父项。)

那么,我如何在不接触任何相同的孩子/父母的情况下找到特定的(深层项目)来使用它。

我猜测这是 MainTestList.SelectedItem 与 MainTestList 树的某种匹配,但我不确定具体会如何进行,然后以某种方式形成一条路径以专门与该深层项目一起工作?

c# treeview
1个回答
1
投票

对于这种情况,我们需要辅助方法来递归扫描

TreeView
以便找到要删除的项目。这是实现:

private bool RemoveChildFromTreeView(ItemCollection parentTreeViewItems, TreeViewItem treeViewItem)
{
    if (parentTreeViewItems.Contains(treeViewItem))
    {
        parentTreeViewItems.Remove(treeViewItem);
        return true;
    }

    foreach (TreeViewItem item in parentTreeViewItems)
    {
        if (RemoveChildFromTreeView(item.Items, treeViewItem))
            return true;
    }

    return false;
}

你可以像这样调用它

RemoveChildFromTreeView(MainTreeView.Items, (TreeViewItem)MainTreeView.SelectedItem);
© www.soinside.com 2019 - 2024. All rights reserved.