0

Il doit y avoir une meilleure façon alors ce qui suit pour obtenir « childitem »Obtenir le TreeViewItem sur les articles nouvellement créés

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 item.ItemGenerator.ContainerFromItem (enfant) ne fonctionne pas (doit être dû à l'élément qui vient d'être créé)

Répondre

0

La génération de conteneur d'articles est asynchrone, donc vous ne pouvez pas supposer que le conteneur existera dès que l'élément a été ajouté. Vous devrez joindre un gestionnaire à l'événement ItemContainerGenerator.StatusChanged afin que votre code soit informé lorsque la génération de conteneur est terminée.

entrée de blog de Dr. WPF "ItemsControl: 'G' is for Generator" a une bonne description du problème et fournit un exemple d'utilisation 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; 
     } 
    } 
}