wpf manually generate TreeViewItem container

2019-02-27 23:06发布

问题:

I am creating a TreeView at runtime. It has several nodes(TreeViewItem), each one having a name. Initially it is collapsed. A separate comboBox displays Names of all TreeViewItem. I have to highlight a TreeViewItem based on the Name selected. I am using a recursive function and gets the TreeViewItem container like this:

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

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

but it is

parent.ItemContainerGenerator.Status = GeneratorStatus.NotStarted

for all the collapsed items. How can I generate containers for them manually(Without expanding them)?

回答1:

Anytime you find yourself walking the visual tree you should think seriously about building a view model.

the view model can increase the treeviews functionality without worrying about the kinds of issues you are facing.

The view model for your application would have a couple of extra properties

IsSelected

IsExpanded

IsHighlighted

as well as your

Data

then you would bind (using an ItemContainerStyle) the IsSelected, IsHighlighted and IsExpanded to the TreeViewItem, then as you had a collection of these view models you could do your search on the view model and just set the property IsHighlighted. The view model would then respond and because of the binding to the style it would highlight the treeviewitem if you wanted. It could also do funky stuff like expand all the nodes above. The tree view would respond to this.

The view model when combined with a treeview gives much more flexibility and stops those visual tree crawling exercises (which are a hack, and feel dirty)

here is a good article about the ViewModel and the TreeView...