ItemContainerGenerator

ItemContainerGenerator

我有一个数据绑定的TreeView。我想扩展TreeViewItems,但只能说3个深度。

通常我会发出TreeViewItem.ExpandSubtree(),但是这样会扩展所有内容,所以我花了点功夫制作了自己的刺刀,因为它应该很简单吧?

这是我尝试的方法,我做了下面的方法,然后将树视图ItemContainerGenerator传递给它,并将树视图中的items集合传递给深度为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。当我捕获null时,这意味着树只打开到1的深度,而不是我想要的3。

我在这里想念什么?

最佳答案

您错过了给孩子ItemContainerGenerator时间创建孙子项的延迟。解决方案是要求WPF调度程序在数据绑定基础结构有时间运行之后安排递归调用:

Action recurse = () => ExpandTree(itm.ItemContainerGenerator, itm.Items, depth);
itm.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, recurse);  // note the priority


现在,在调用委托时,ItemContainerGenerator将有时间运行,并且容器将可用。

您可能还可以通过订阅子ItemContainerGenerator的StatusChanged事件(并从那里进行递归调用)来做到这一点,但是我没有尝试过这种方法。

关于c# - WPF Treeview仅扩展到一定深度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4857248/

10-17 02:22