我在 WPF 中设置了一个静态(暂时)树。我试图从父项中删除特定的子项,这是 main 的子项,但不确定如何进行。树的结构如下:
我有一个删除按钮,其中的 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 树的某种匹配,但我不确定具体会如何进行,然后以某种方式形成一条路径以专门与该深层项目一起工作?
对于这种情况,我们需要辅助方法来递归扫描
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);