0

Там должно быть лучше тогда следующее для получения «Childitem»Получение TreeViewItem на вновь созданных элементов

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

По какой-то причине item.ItemGenerator.ContainerFromItem (ребенок) не работает (должно быть связано к объекту, который только что был создан)

ответ

0

Создание контейнера элементов является асинхронным, поэтому вы не можете предположить, что контейнер будет существовать, как только элемент будет добавлен. Вам нужно будет подключить обработчик к событию ItemContainerGenerator.StatusChanged, чтобы ваш код был проинформирован о завершении создания контейнера.

запись в блоге доктора WPF в "ItemsControl: 'G' is for Generator" имеет хорошее описание проблемы и дает пример использования 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; 
     } 
    } 
} 
Смежные вопросы