wpf вручную создает контейнер TreeViewItem

Я создаю 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 ответ

Решение

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

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

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

IsSelected

IsExpanded

IsHighlighted

а также ваш

Data

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

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

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

Другие вопросы по тегам