WPF Treeview只扩展到一定深度?

时间:2011-01-31 23:18:32

标签: c# wpf treeview treeviewitem

我有一个数据绑定的TreeView。我想扩展TreeViewItems但仅限于3的深度。

通常情况下我会发出一个TreeViewItem.ExpandSubtree(),但这会扩展所有内容,所以我自己做了一个刺,因为它应该相当简单吧?

这是我尝试过的,我制作了下面的方法,然后将我的树视图ItemContainerGenerator传递给它以及树视图中的项目集合,深度为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。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

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

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

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

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