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. Затем модель представления ответит и из-за привязки к стилю выделит элемент дерева, если хотите. Это также может делать такие вещи, как расширение всех узлов выше. Представление дерева ответило бы на это.
Модель представления в сочетании с древовидным представлением дает гораздо большую гибкость и останавливает те визуальные упражнения по ползанию по дереву (которые являются хаком и чувствуют себя грязными)