Domanda

Deve esserci un modo migliore quindi quanto segue per ottenere "ChildItem"

    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;
    }
.

per qualche motivo oggetto.Itemgenerator.ContainerFromitem (Bambino) non funziona (deve essere dovuto all'articolo appena stato creato)

È stato utile?

Soluzione

La generazione del contenitore dell'articolo è asincrono, quindi non è possibile assumere che il contenitore esisterà non appena è stato aggiunto l'oggetto.Avrai bisogno di allegare un gestore al ItemContainergenenerator.StatusCoded Event Quindi il tuo codice sarà informato quando la generazione di container è completa.

DR.WPF's Blog Entry "ArticoliControl: 'G' è perGeneratore " ha una buona descrizione del problema e fornisce un esempio di utilizzo di uno statuscanged:

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;
        }
    }
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top