Question

Il doit y avoir une meilleure façon, alors ce qui suit pour obtenir "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;
    }

Pour une raison quelconque de raison.ItemGenerator.ContainerFromitem (enfant) ne fonctionne pas (doit être dû à l'élément qui vient d'être créé)

Était-ce utile?

La solution

La génération de conteneurs d'élément est asynchrone. Vous ne pouvez donc pas supposer que le conteneur existe dès que l'élément a été ajouté.Vous devrez joindre un gestionnaire au itemContainer.Statuschanged événement afin que votre code soit informé lorsque la génération de conteneurs est terminée.

dr.Entrée de blog de WPF "" ArticlesControl: "G" est pourGénérateur " a une bonne description du problème et fournit un exemple d'utilisation de StatusChanged:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top