0

必須有則獲得「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; 
    } 

出於某種原因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; 
     } 
    } 
}