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(child) が機能しません (作成されたばかりのアイテムが原因である必要があります)

4

1 に答える 1

0

アイテム コンテナーの生成は非同期であるため、アイテムが追加されるとすぐにコンテナーが存在するとは想定できません。コンテナーの生成が完了したときにコードに通知されるよう に、ハンドラーをItemContainerGenerator.StatusChangedイベントにアタッチする必要があります。

Dr. 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;
        }
    }
}
于 2010-07-24T13:16:51.383 に答える