wpf treeview 查找节点时 节点多的时候,出现ContainerFromItem返回null

/// <summary>
        /// 是否已经找到节点,找到后就不在执行代码
        /// </summary>
        bool ItemFocus_While = false;

        private void ItemFocus(ItemsControl ctrl, string strVehicleNo)
        {
            for (int i = 0; i < ctrl.Items.Count; i++)
            {
                System.Threading.Thread.Sleep(1);

                if (ItemFocus_While)
                    return;

                object obj = ctrl.Items[i];

                kypt_Model.TreeItem treeItem = (kypt_Model.TreeItem)obj;

                TreeViewItem container = ctrl.ItemContainerGenerator.ContainerFromItem(obj) as TreeViewItem;

                if (container != null)
                {
                    if (treeItem.text.Split('(')[0] == strVehicleNo)
                    {
                        List<kypt_Model.TreeItem> list = new List<kypt_Model.TreeItem>();

                        kypt_Model.TreeItem iTreeItem = treeItem;

                        while (true)
                        {
                            kypt_Model.TreeItem tTreeItem = (kypt_Model.TreeItem)iTreeItem.GetType().GetProperty("parent").GetValue(iTreeItem, null);

                            if (tTreeItem != null)
                            {
                                list.Add(tTreeItem);
                                iTreeItem = tTreeItem;
                            }
                            else
                            {
                                TreeViewItem treeViewItem = null;

                                for (int it = list.Count - 1; it > 0; it--)
                                {
                                    //利用反射获取父节点
                                    if (treeViewItem == null)
                                    {
                                        treeViewItem = treeViewMine.ItemContainerGenerator.ContainerFromItem(list[it - 1]) as TreeViewItem;
                                    }
                                    else
                                    {
                                        treeViewItem = treeViewItem.ItemContainerGenerator.ContainerFromItem(list[it - 1]) as TreeViewItem;
                                    }

                                    treeViewItem.IsExpanded = true;
                                }

                                break;
                            }
                        }

                        container.IsSelected = true;
                        container.Focus();
                        ItemFocus_While = true;

                        break;
                    }
                    else
                    {
                        container.IsExpanded = true;//一定要展开,要不查出null
                        if (container.ItemContainerGenerator.Status != System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated)
                        {
                            container.UpdateLayout();
                        }

                        if (treeItem.vehicleNo == "")
                        {
                            container.IsExpanded = false;

                            if (((kypt_Model.TreeItem)treeViewMine.Items[0]).text == treeItem.text)
                            {
                                container.IsExpanded = true;
                            }

                            //ctrl = container;

                            ItemFocus(container, strVehicleNo);
                        }
                    }
                }
            }
        }

 执行以上,正常情况下,查找节点并打开节点是没问题的,郁闷的是,千万不能在xaml里在treeview里加入

VirtualizingStackPanel.IsVirtualizing="True"

我找了一上午才发现这个东东会让

ctrl.ItemContainerGenerator.ContainerFromItem(obj)

返回null。。去掉就可以了。可能会损耗点性能。。

 

记录一下

posted @ 2012-11-30 13:42  项工  阅读(1625)  评论(0)    收藏  举报