必须更好的方法,然后进行以下内容“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)不起作用(必须是由于刚刚创建的项目)

有帮助吗?

解决方案

项目容器生成是异步的,所以您不能假设在添加项目后立即存在容器。您需要将处理程序附加到 ItemContainergenerator.StatusChanged 活动,因此当容器生成完成时,您的代码将被通知。

博士。WPF的博客条目“项目control:'g'是生成器“具有良好的问题描述,并提供了使用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;
        }
    }
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top