Loading

WPF TreeView大数据量多层级搜索定位

private  bool ExpandAndSelectItem(ItemsControl parentContainer, object itemToSelect)
     {
         //检查当前级别的所有项目
         foreach (Object item in parentContainer.Items)
         {
             TreeViewItem currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
             //如果数据项与我们要选择的项匹配,则设置相应的项
             //TreeViewItem 是被选为真的
             if (item == itemToSelect && currentContainer != null)
             {
                 currentContainer.IsSelected = true;
                 currentContainer.BringIntoView();
                 currentContainer.Focus();
                 //item被找到
                 return true;
             }
         }
         //如果我们到达这一点,在当前级别上找不到所选项目,所以我们必须检查 children
         foreach (Object item in parentContainer.Items)
         {
             TreeViewItem currentContainer = parentContainer.ItemContainerGenerator.ContainerFromItem(item) as TreeViewItem;
             //如果 children 存在
             if (currentContainer != null && currentContainer.Items.Count > 0)
             {
                 //跟踪树视图项是否被扩展
                 bool wasExpanded = currentContainer.IsExpanded;
                 //展开当前的树视图项,以便我们可以检查它的子树视图项
                 currentContainer.IsExpanded = true;
                 //如果尚未生成树视图项子容器,则必须侦听
                 //状态更改事件,直到它们是
                 if (currentContainer.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                 {
                     //将事件处理程序存储在变量中,以便我们可以删除它(在处理程序本身中)
                     EventHandler eh = null;
                     eh = new EventHandler(delegate
                     {
                         if (currentContainer.ItemContainerGenerator.Status == GeneratorStatus.ContainersGenerated)
                         {
                             if (ExpandAndSelectItem(currentContainer, itemToSelect) == false)
                             {
                                 //假设在此事件处理程序中执行的代码是父进程的结果
                                 //由于没有生成容器而被扩展。
                                 //由于在孩子们中找不到“选择”项,所以折叠父项,因为它以前是折叠的
                                 currentContainer.IsExpanded = false;
                             }
                             //删除状态更改事件处理程序,因为我们刚刚处理了它(我们只需要它一次)
                             currentContainer.ItemContainerGenerator.StatusChanged -= eh;
                         }
                     });
                     currentContainer.ItemContainerGenerator.StatusChanged += eh;
                 }
                 else //否则容器已经生成,所以在子目录中查找要选择的项
                 {
                     if (ExpandAndSelectItem(currentContainer, itemToSelect) == false)
                     {
                         //恢复当前树视图项的扩展状态
                         currentContainer.IsExpanded = wasExpanded;
                     }
                     else //否则找到并选择节点,因此返回true
                     {
                         return true;
                     }
                 }
             }
         }
         //找不到item
         return false;
     }

 

posted @ 2022-06-22 13:57  jevan  阅读(345)  评论(0编辑  收藏  举报