Я создаю TreeView во времени выполнения. Это имеет несколько узлов (TreeViewItem), каждый имеющий имя. Первоначально это сворачивается. Отдельное поле комбинированного списка отображает Названия всего TreeViewItem. Я должен выделить TreeViewItem на основе выбранного Имени. Я использую рекурсивную функцию и получаю контейнер TreeViewItem как это:
if (parent.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
continue;
TreeViewItem container = parent.ItemContainerGenerator.ContainerFromItem(child).As<TreeViewItem>();
но это
родитель. ItemContainerGenerator. Состояние = GeneratorStatus. NotStarted
для всех свернутых объектов. Как я могу генерировать контейнеры для них вручную (Не разворачивая их)?
Каждый раз, когда вы обнаруживаете, что идете по визуальному дереву, вы должны серьезно подумать о построении модели представления.
Модель представления может увеличить функциональность дерева, не беспокоясь о тех проблемах, с которыми вы столкнулись.
Модель представления для вашего приложения будет иметь пару дополнительных свойств
IsSelected
IsExpanded
IsHighlighted
а также ваши
Data
затем вы привяжете (используя ItemContainerStyle) IsSelected, IsHighlighted и IsExpanded к TreeViewItem, затем, поскольку у вас есть коллекция этих моделей представления, вы можете выполнить поиск по модели представления и просто установить свойство IsHighlighted. Тогда модель представления откликнется и благодаря привязке к стилю выделит элемент TreeViewItem по вашему желанию. Она также может делать такие забавные вещи, как раскрытие всех узлов выше. Древовидное представление будет реагировать следующим образом.
Модель представления в сочетании с древовидным представлением дает гораздо больше гибкости и прекращает эти визуальные упражнения по ползанию по дереву (которые являются хаком, и чувствуют себя грязными)