WPF TreeView控件根据数据内容跳转到指定节点

发布时间 2023-03-28 16:43:22作者: Dwaynerbing

1、问题描述

一般,当我们需要展开TreeView控件的某一节点时,可以在TreeView控件的TreeViewItem所绑定的数据结构上增加一个bool属性,然后与TreeViewItem的IsExpand属性相绑定,再将该数据属性置为true即可展开该节点。

​ 但当数据结构不方便扩展增加属性时,如何根据指定的数据内容跳转到对应的节点上呢?

2、解决方法

        // 通过数据内容跳转到指定的控件节点上
        private static TreeViewItem FindTreeViewItem(ItemsControl item, object data)
        {
            TreeViewItem findItem = null;
            for (int i = 0; i < item.Items.Count; i++)
            {
                if(item.ItemContainerGenerator.ContainerFromIndex(i) is TreeViewItem tvItem)
                {
                    if (tvItem == null)
                    {
                        continue;
                    }

                    if (tvItem.DataContext == data)
                    {
                        findItem = tvItem;
                        break;
                    }
                    else if (tvItem.Items.Count > 0)
                    {
                        if (!tvItem.IsExpanded)
                        {
                            // 打开未选中节点
                            tvItem.SetValue(TreeViewItem.IsExpandedProperty, true);
                            tvItem.UpdateLayout();
                        }
                        findItem = FindTreeViewItem(tvItem, data);
                        if (findItem != null)
                        {
                            break;
                        }
                        else
                        {
                            // 关闭未选中节点
                            tvItem.SetValue(TreeViewItem.IsExpandedProperty, false);
                            tvItem.UpdateLayout();
                        }
                    }
                }
            }
            return findItem;
        }