我有一个数据绑定(bind)的 TreeView。我想扩展 TreeViewItems,但只能扩展到 3 的深度。
通常我会发出一个 TreeViewItem.ExpandSubtree() ,但这会扩展所有内容,所以我尝试制作自己的,因为它应该相当简单,对吗?
这是我尝试过的,我创建了下面的方法,然后将我的 TreeView ItemContainerGenerator 传递给它以及 TreeView 中的项目集合,深度为 3。
private void ExpandTree(ItemContainerGenerator gen, ItemCollection items, int depth)
{
depth--;
foreach (var item in items)
{
TreeViewItem itm = (TreeViewItem)gen.ContainerFromItem(item);
if (itm == null) continue;
itm.IsExpanded = true;
if(depth!=0 && itm.Items.Count > 0) ExpandTree(itm.ItemContainerGenerator,itm.Items,depth);
}
}
问题在于,第一次递归回调所有子项的 ItemContainerGenerator 时状态为“NotStarted”,并且每次调用都返回 null。当我捕获空值时,这意味着树的开口深度仅为 1,而不是我想要的深度 3。
我在这里缺少什么?
最佳答案
您错过了为子 ItemContainerGenerator 创建孙子项目提供时间的延迟。解决方案是要求 WPF 调度程序在数据绑定(bind)基础结构有时间运行之后安排递归调用:
Action recurse = () => ExpandTree(itm.ItemContainerGenerator, itm.Items, depth);
itm.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, recurse); // note the priority
现在,当委托(delegate)被调用时,ItemContainerGenerator 将有时间运行,并且容器将可用。
您也可以通过订阅子 ItemContainerGenerator 的 StatusChanged 事件(并从那里进行递归调用)来实现此目的,但我还没有尝试过这种方法。
关于c# - WPF Treeview 只扩展到一定深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4857248/