WPF Treeview расширяется только до определенной глубины?
-
27-10-2019 - |
Вопрос
У меня есть дерево, которая является базой базы. Я хотел бы расширить TreeViewItems, но только на глубину, скажем, 3.
Обычно я выпускал бы reeviewitem.expandsubtree (), но это расширяет все, поэтому я сделал удар, делая свой собственный, так как это должно быть довольно простым, верно?
Вот что я попробовал, я сделал метод ниже, а затем передал мне свой обзор.
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 для всех субситемов, имеет статус «незаписи» и возвращает ноль каждый раз, когда его называют. В то время как я поймал ноль, это означает, что дерево открывается только на глубину 1, а не 3, которые я хотел.
Что мне здесь не хватает?
Решение
Вам не хватает задержки, чтобы дать дочерним предметам времени, чтобы создать внуков. Решение состоит в том, чтобы попросить диспетчера WPF запланировать рекурсивный вызов после Инфраструктура привязки данных успела работать:
Action recurse = () => ExpandTree(itm.ItemContainerGenerator, itm.Items, depth);
itm.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, recurse); // note the priority
Теперь, к тому времени, когда делегат будет вызван, у ItemContainerGenerator будет время работать, и контейнеры будут доступны.
Вы, вероятно, также могли бы сделать это, подписываясь на статусное событие DemberContainerGenerator (и сделав рекурсивный вызов оттуда), но я не пробовал этот подход.