在WPF Treeview中搜索特定的TreeViewItem

我正在使用wpf TreeView。我正在尝试搜索中的所有项目,TreeView以在其中找到所需的项目TreeViewItem。


我的代码:

parent是string我要搜索的所需项目的标题。


foreach (TreeViewItem item in treeView.Items)

{    

   if (item.Header.ToString().Contains(parent))

   {

       //Do Something to item that is found 

   }

}

我在这段代码中遇到的问题是它将在的顶部两层进行搜索TreeView。如果item内的item内有一个TreeView,则item找不到。话虽如此,我还是在代码中添加了代码,但这只会将问题延长到更高一级TreeView。


foreach (TreeViewItem item in treeView.Items)

{

   foreach(TreeViewItem subItem in item.Items)

   {

       if (subItem.Header.ToString().Contains(parent))

       {

           //Do Something to item that is found         

       }

   }    

   if (item.Header.ToString().Contains(parent))

   {

       //Do Something to item that is found 

   }

}

有没有一种方法可以搜索整个内容TreeView以及其中的所有items内容?我可以TreeView递归搜索吗?


慕桂英4014372
浏览 411回答 3
3回答

人到中年有点甜

您应该研究递归。本质上,您需要一个采用treeviewitem并遍历其所有子级的方法。对于每一个方法,该方法都会调用自身,并传入孩子。如果您从未做过此事,那么当您初次查看它时会有点头脑融化。了解原理。但大致来说:    private void recurseItem(TreeViewItem item)    {        foreach (var subItem in item.Items)        {            // compare header and return that item if you find it            if(!gotTheItem)               recurseItem(subItem);        }    }您需要一个遍历树的顶级项目的foreach循环,并将每个项目传递到其中。不要只是将其粘贴(您只是学习剪切然后粘贴)阅读递归并考虑一下。请注意,您将要通过设置布尔标志来表示已找到该项目,并避免重复其余所有操作,以表示已找到该项目。请注意,此代码主要是为了向递归的概念介绍新手。它并非旨在成为理想的剪切和粘贴解决方案。如果使用绑定的树视图尝试此操作,则会发现Items集合具有绑定的对象,而不是treeviewitems。

慕容708150

Andy的解决方案将满足您的需求,但是更加通用和可重用的解决方案将是迭代使用ItemCollection。有了这个,您可以传递任何继承了ItemCollectionwhile的对象类型,从而避免不包含子项目的异常。如果您的树中有不同类型的孩子,那就太好了。private void IterateTree(ItemCollection items){         //Iterate each item    foreach (var item in items)    {        //Your IF logic here        //Iterate again if item contains sub items.        if (item is ItemsControl)        {            ItemsControl ic = (ItemsControl)item;            IterateTree(ic.Items); //Recursive call        }    }       }
打开App,查看更多内容
随时随地看视频慕课网APP