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。。去掉就可以了。可能会损耗点性能。。
记录一下
浙公网安备 33010602011771号