要获取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容器,以便它们可以像第一级子级一样重新展开。