WPF Treeview расширяется только до определенной глубины?

StackOverflow https://stackoverflow.com/questions/4857248

  •  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 (и сделав рекурсивный вызов оттуда), но я не пробовал этот подход.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top