wpf вручную создает контейнер TreeViewItem - PullRequest
1 голос
/ 22 апреля 2010

Я создаю TreeView во время выполнения. Он имеет несколько узлов (TreeViewItem), каждый из которых имеет имя. Первоначально он рухнул. Отдельный comboBox отображает имена всех TreeViewItem. Я должен выделить TreeViewItem на основе выбранного имени. Я использую рекурсивную функцию и получаю контейнер TreeViewItem следующим образом:

if (parent.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
                continue;

TreeViewItem container = parent.ItemContainerGenerator.ContainerFromItem(child).As<TreeViewItem>();

но это

parent.ItemContainerGenerator.Status = GeneratorStatus.NotStarted

для всех свернутых предметов. Как я могу создать контейнеры для них вручную (без их расширения)?

1 Ответ

2 голосов
/ 22 апреля 2010

Каждый раз, когда вы идете по дереву визуалов, вы должны серьезно задуматься о построении модели вида.

модель представления может расширить функциональность древовидных представлений, не беспокоясь о проблемах, с которыми вы сталкиваетесь.

Модель представления для вашего приложения будет иметь несколько дополнительных свойств

IsSelected

IsExpanded

IsHighlighted

а также ваш

Data

тогда вы привязали бы (используя ItemContainerStyle) IsSelected, IsHighlighted и IsExpanded к TreeViewItem, затем, когда у вас была коллекция этих моделей представлений, вы могли бы выполнить поиск по модели представления и просто установить свойство IsHighlighted. Затем модель представления ответит и из-за привязки к стилю выделит элемент дерева, если вы хотите. Это также может сделать такие вещи, как расширение всех узлов выше. Представление дерева ответило бы на это.

Модель представления в сочетании с древовидным представлением дает гораздо большую гибкость и останавливает те визуальные упражнения по ползанию по дереву (которые являются хаком и чувствуют себя грязными)

Вот хорошая статья о ViewModel и TreeView ...

...