1
votes

I have a WPF TreeView which displays my ViewModel. I have a button that adds an item to a collection in the underlying ViewModel which adds a child node to the tree. This part works.

What I want is the newly added item to be the SelectedItem of the tree view.

I have read this already: How to programmatically select an item in a WPF TreeView? but it is not working because the items I am adding to the Tree are not TreeViewItems they are classes in my Model.

I have also read this: Simplifying the WPF TreeView by Using the ViewModel Pattern however I don't want to create a ViewModel for every item I add to the TreeView. I feel it creates unnecessary redundant objects. i.e. I have my ViewModel with a IsSelected property that wraps my Model that does not have a IsSelected property. This causes too much cruft in working with my actual ViewModel.

Is there anyway to tell the TreeView to select newly added items to it? Programmatically or by XAML.

Thanks.

1

1 Answers

1
votes

I don't think there is any direct way to select a newly added item to a TreeView because the TreeView itself is unaware of the change. The TreeViewItem's get generated upon expansion and every TreeViewItem is itself an ItemsControl managing their own containers for their children.
Maybe there is a possibilty of expanding the whole TreeView when loaded and the get the ObservableCollection for each container and then listen to the CollectionChanged event but since the View doesn't know the type of the collection then an IList is probably the best it can do and there we don't have the CollectionChanged event so I don't see it. But maybe I'm missing something..

Anyway, I'd use this approach (which I saw you had looked into already) since it'll probably give you the least trouble but if you come up with a better solution than I'd be glad to know what is was :-)

<TreeView ...>
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>