代码之家  ›  专栏  ›  技术社区  ›  Scott M.

如何缓存TreeViewItems以在重新绑定后重新展开?

  •  1
  • Scott M.  · 技术社区  · 14 年前

    要获取TreeViewItem,我使用ItemsControl的ItemContainerGenerator属性:

    TreeViewItem cfItem = treeView.ItemContainerGenerator
        .ContainerFromItem(obj) as TreeViewItem;
    cfItem.IsExpanded = true;
    

    第二级集合都有对其父对象的引用。因为我有很多这样的对象,它们是循环的,每个都使用它的父对象来找到它的父对象的TreeViewItem。它们被添加到集合中的顺序保证(我认为)子级总是在父级之后被处理。因此我得到了一行难看的代码:

    qualItem = (
        (TreeViewItem)treeView.ItemContainerGenerator
            .ContainerFromItem(
                ((Child)obj).ParentObject
            )
        )
        .ItemContainerGenerator.ContainerFromItem(obj) as TreeViewItem;
    

    当试图从item obj获取容器时,此行总是失败。它成功地获取了父TreeViewItem,但是当尝试获取子TreeViewItem容器时,我总是收到null。文档说明ContainerFromItem()返回

    “System.Windows.ui元素 如果项目不属于 尚未找到System.Windows.UIElement 为它生成。”

    我知道父项集合中存在第二级子项。我在VS2010中签入了调试器,所有的项都在那里。我花了很长时间在Google上搜索答案,遇到一个人,他说容器项目是在后台工作线程上创建的,在尝试获取子项目容器时可能不会生成。我尝试等待ItemContainerGenerator的Status属性等于GeneratorStatus.ContainerGenerated,但仍然得到相同的结果。我需要以某种方式为我的第二级子级获取TreeViewItem容器,以便它们可以像第一级子级一样重新展开。

    2 回复  |  直到 14 年前
        1
  •  0
  •   decyclone    14 年前

    “与给定项相对应的System.Windows.ui元素。如果项不属于项集合,则返回null;或者 如果尚未为其生成System.Windows.UIElement

    看起来是因为 Virtualization ,的 UIElement 你寻找的东西在你寻找的时候并不存在。如果集合不是太大,请尝试转动 关。

        2
  •  0
  •   Scott M.    14 年前

    我的主要信息来源是这篇文章:

    http://msdn.microsoft.com/en-us/magazine/dd419663.aspx