c# - WPF Treeview 只扩展到一定深度?

标签 c# wpf treeview treeviewitem

我有一个数据绑定(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/

相关文章:

c# - 检测控制台退出事件

c# - 检测 MongoDB 状态

c# - WPF DataGrid 删除 SelectedItems

c++ - Gtkmm3 TreeView ListStore.Clear 或 TreeSelection.unselectAll 导致错误

php - 如何在PHP中实现jQuery异步树形 View ?

c# - 如何从 C# 数据表在 MySql 中创建临时表?

c# - MVC : Dictionary requires a model item of type 'System.Collections.Generic.IEnumerable` 1

wpf - Touch 和 Stylus WPF 有什么区别

wpf mousecapture 立即强制释放

delphi - 如何在Delphi 7中的treeView中显示注册表