获取新创建项目的 TreeViewItem

发布于 2024-09-11 05:36:46 字数 556 浏览 2 评论 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) 不起作用(必须是由于刚刚创建的项目)

There has to be a better way then the following for getting "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;
    }

For some reason item.ItemGenerator.ContainerFromItem(child) does not work (must be due to the item having just been created)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你对谁都笑 2024-09-18 05:36:47

项目容器生成是异步的,因此您不能假设添加项目后容器就会存在。您需要将处理程序附加到 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;
        }
    }
}

Item container generation is asynchronous, so you cannot assume the container will exist as soon as the item was added. You will need to attach a handler to the ItemContainerGenerator.StatusChanged event so your code will be informed when container generation is complete.

Dr. WPF's blog entry "ItemsControl: 'G' is for Generator" has a good description of the problem and provides an example of using 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;
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文