Pregunta

Tiene que haber una mejor manera de que lo siguiente para obtener "infantil"

    TaskItem task = (sender as Canvas).DataContext as TaskItem;
    TaskItem child = Tasks.CreateTask("New task", task);
    TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromItem(task) as TreeViewItem;            

    item.UpdateLayout();
    TreeViewItem childItem = null;
    foreach (var i in item.GetDescendantContainers())
    {
        if (i.GetItem() == child)
            childItem = i;
    }

por alguna razón elemento.itemgenerator.containerdefromitem (niño) no funciona (debe deberse al artículo que se ha creado)

¿Fue útil?

Solución

La generación del contenedor del elemento es asíncrono, por lo que no puede asumir que el contenedor existirá tan pronto como se agregó el artículo.Tendrá que adjuntar un manejador a la ItemContaIgeratorEvento .statuschanged para que su código se informará cuando se complete la generación de contenedores.

dr.Entrada del blog de WPF "artículoscontrol: 'g' es paraEl generador " tiene una buena descripción del problema y proporciona un ejemplo de usando el estado de estado:

private void AddScooby()
{
    _scooby = new Character("Scooby Doo");
    Characters.Add(_scooby);
    CharacterListBox.ItemContainerGenerator.StatusChanged
        += OnStatusChanged;
}

private void OnStatusChanged(object sender, EventArgs e)
{
    if (CharacterListBox.ItemContainerGenerator.Status
        == GeneratorStatus.ContainersGenerated)
    {
        CharacterListBox.ItemContainerGenerator.StatusChanged
            -= OnStatusChanged;
        ListBoxItem lbi = CharacterListBox.ItemContainerGenerator
            .ContainerFromItem(_scooby) as ListBoxItem;
        if (lbi != null)
        {
            lbi.IsSelected = true;
        }
    }
}

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