У меня есть TreeView, который связан с классом коллекции, который я не могу контролировать.Внутри этого класса находится коллекция объектов, каждый из которых имеет свою коллекцию предметов.Эта иерархия зафиксирована на глубине 3.Дочерние элементы TreeView содержатся в ObservableCollection и обновляются в TreeView соответственно.Коллекции внутри каждого из этих объектов не наблюдаемы, и поэтому мне приходится вручную заново привязывать данные к TreeView каждый раз, когда я добавляю объект одному из дочерних объектов.Это приводит к тому, что все расширенные дочерние элементы возвращаются в нерасширенное состояние.Я пытаюсь кэшировать объекты, которые были расширены, чтобы они могли быть повторно расширены после повторной привязки.Дети работают, как я и ожидал, однако, когда я пытаюсь раскрыть внука TreeView, я получаю нулевой объект.
Чтобы получить TreeViewItem, я использую свойство ItemContainerGenerator ItemsControl:
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;
Эта строка всегда завершается ошибкой, когда она пытается получить контейнер из объекта obj.Он успешно получает родительский TreeViewItem, но, пытаясь получить дочерний контейнер TreeViewItem, я всегда получаю ноль.В документации говорится, что ContainerFromItem () возвращает
"System.Windows.UIElement, который соответствует данному элементу. Возвращает значение NULL, если элемент не принадлежит коллекции элементов, или если System.Windows.UIElement не был сгенерирован для него. "
Я знаю, что дочерний элемент второго уровня существует в коллекции элементов родителя.Я проверил в отладчике в VS 2010, и все элементы там.Я потратил много времени на поиск ответа в Google и наткнулся на человека, который сказал, что элементы контейнера создаются в фоновом рабочем потоке и могут не сгенерироваться к тому времени, когда делается попытка получить контейнер дочерних элементов.Я пытался дождаться, чтобы свойство Status ItemContainerGenerator было равно GeneratorStatus.ContainersGenerated, но я все еще получил тот же результат.Мне нужно каким-то образом получить контейнер TreeViewItem для моих дочерних элементов второго уровня, чтобы их можно было повторно развернуть так же, как дочерние элементы первого уровня.