Pregunta

Tengo una vista de árbol que está databund. Me gustaría expandir los TreeViewitems, pero solo a una profundidad de vamos a decir 3.

Normalmente emitiría un TreeViewitem.EXPANDSUBTREE () pero eso amplía todo, así que tomé una puñalada haciendo la mía, ya que debería ser bastante simple, ¿verdad?

Esto es lo que probé, hice el método a continuación y luego pasé mi TreeViews itemContainGenerator y la colección de elementos desde el TreeView, con una profundidad de 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);
    }
}

El problema es que la primera vez que devuelve recursivamente al itemContainGenerator para todos los subitems tiene un estado de "no se nota" y devuelve nulo cada vez que se llama. Mientras trampa el nulo, significa que el árbol solo se abre a una profundidad de 1 y no a los 3 que quería.

¿Que me estoy perdiendo aqui?

¿Fue útil?

Solución

Le faltan un retraso para darle tiempo al niño que concluye elguerador para crear a los nietos. La solución es pedirle al despachador de WPF que programen la llamada recursiva después La infraestructura de enlace de datos ha tenido tiempo de ejecutar:

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

Ahora, para cuando se llame al delegado, el itemContainGenerator habrá tenido tiempo de ejecutar, y los contenedores estarán disponibles.

Probablemente también podría hacer esto suscribiéndose al evento de cambio de estado de ItemContainGenerator del niño (y haciendo la llamada recursiva desde allí), pero no he probado este enfoque.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top