WPF TreeView Clear Selection

How can I clear the selection of TreeView in WPF TreeView? I tried to execute a TreeNodes and clear the IsSelected property, but this is ReadOnly property. Any ideas?

TreeView uses an XML binding through an XMLDataProvider object.

+7
wpf treeview
source share
9 answers

I ran into the same problems and wrote the following code that will work on any tree view with one call to one row for the first function.

 class TomWrightsUtils { public static void ClearTreeViewSelection(TreeView tv) { if (tv != null) ClearTreeViewItemsControlSelection(tv.Items, tv.ItemContainerGenerator); } private static void ClearTreeViewItemsControlSelection(ItemCollection ic, ItemContainerGenerator icg) { if ((ic != null) && (icg != null)) for (int i = 0; i < ic.Count; i++) { TreeViewItem tvi = icg.ContainerFromIndex(i) as TreeViewItem; if (tvi != null) { ClearTreeViewItemsControlSelection(tvi.Items, tvi.ItemContainerGenerator); tvi.IsSelected = false; } } } } 
+10
source share

Not sure what you mean by TreeNodes.

Usually you have the corresponding IsSelected property on your view model that your view is associated with:

 <TreeView> <TreeView.ItemContainerStyle> <Style TargetType="TreeViewItem"> <Setter Property="IsSelected" Value="{Binding IsSelected}"/> </Style> </TreeView.ItemContainerStyle> </TreeView> 

Therefore, you simply scroll through the data elements in your view model and set IsSelected = false .

However, it seems that you do not have such a property. In this case, you need to get the corresponding TreeViewItem for each data item. For information on how to do this, see the TreeView.ItemContainerGenerator Property. Something like:

 var treeViewItem = _treeView.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; treeViewItem.IsSelected = false; 
+8
source share

Find the selected item and set the value:

 private void Button_Click(object sender, RoutedEventArgs e) { TreeViewItem tvi = treeviewExample.SelectedItem as TreeViewItem; if (tvi != null) { tvi.IsSelected = false; } } 
+2
source share

This works great as an extension method, so you can call

 youTreeview.ClearSelection(); using System.Windows.Forms; using System.Windows.Controls; namespace YourAppNamespace { public static void ClearSelection(this TreeView input) { // this should be some container that you put in // possibly the actual treeviewitem, not sure on that though var selected = input.SelectedItem; if (selected == null) return; // in my case this works perfectly var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem; var tvi = input.ItemContainerGenerator.ContainerFromItem(selected) as TreeViewItem; if (tvi == null) { // it must be a child, heres a hack fix // my nodes are inherited from TreeViewItemViewModel by Josh Smith var child = selected as WPF.Controls.TreeViewItemViewModel; if (child == null) return; child.IsSelected = false; } else tvi.IsSelected = false; } } 
+2
source share

It was my experience to stay away from standard ItemContainerGenerator calls because they will fail on nodes with depths greater than n + 1. The following is a combination of the following extension methods. The ContainerFromItem extension methods come from the MSDN blog, and for me this is of great importance when working with TreeView.

  public static void ClearSelection(this TreeView input) { var selected = input.SelectedItem; if (selected == null) return; var tvi = input.ContainerFromItem(selected) as TreeViewItem; if (tvi == null) return; tvi.IsSelected = false; } public static TreeViewItem ContainerFromItem(this TreeView treeView, object item) { TreeViewItem containerThatMightContainItem = (TreeViewItem)treeView.ItemContainerGenerator.ContainerFromItem(item); if (containerThatMightContainItem != null) return containerThatMightContainItem; else return ContainerFromItem(treeView.ItemContainerGenerator, treeView.Items, item); } private static TreeViewItem ContainerFromItem(ItemContainerGenerator parentItemContainerGenerator, ItemCollection itemCollection, object item) { foreach (object curChildItem in itemCollection) { TreeViewItem parentContainer = (TreeViewItem)parentItemContainerGenerator.ContainerFromItem(curChildItem); if (parentContainer == null) return null; TreeViewItem containerThatMightContainItem = (TreeViewItem)parentContainer.ItemContainerGenerator.ContainerFromItem(item); if (containerThatMightContainItem != null) return containerThatMightContainItem; TreeViewItem recursionResult = ContainerFromItem(parentContainer.ItemContainerGenerator, parentContainer.Items, item); if (recursionResult != null) return recursionResult; } return null; } 
+1
source share

This seems to work so far, but I just put it as 5 minutes ago, so use it at your own risk. I basically wanted to clear the selection when the user clicks on a tree control, but not on a tree element.

  void DestinationTree_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { TreeView tree = sender as TreeView; DestinationClientViewModel selectedItem = tree.SelectedItem as DestinationClientViewModel; if (selectedItem != null) { int selectedItemIndex = this.DestinationTree.Items.IndexOf(selectedItem); if (selectedItemIndex > -1) { TreeViewItem tvi = this.DestinationTree.ItemContainerGenerator.ContainerFromIndex(selectedItemIndex) as TreeViewItem; if (tvi != null) tvi.IsSelected = false; } } } 
0
source share

I myself came across this situation with a custom implementation of presenting a list of tables after a long search, and finally found a solution that worked for me.

A full explanation can be found at http://social.msdn.microsoft.com/Forums/vstudio/en-US/36aca7f7-0b47-488b-8e16-840b86addfa3/getting-treeviewitem-for-the-selected-item-in-a -treeview

The main idea is to capture the TreeViewItem.Selected event and save the event source in the Tag attribute in the TreeView. Then, when you need to clear it, you can access the Tag attribute in your control and set the IsSelected parameter to False. This works for me with 2 levels of nested children. Hope this works for you.

To save:

TreeView ad

  <TreeView Name="myTreeView" TreeViewItem.Selected="OnItemSelected" ItemsSource="{Binding Source={StaticResource myHierarchicalData}}"/> 

Event handler

 private void OnItemSelected(object sender, RoutedEventArgs e) { myTreeView.Tag = e.OriginalSource; } 

Clear selection logic

 if (myTreeView.SelectedItem != null) { TreeViewItem selectedTVI = myTreeView.Tag as TreeViewItem; // add your code here mine was selectedTVI.IsSelected = false; } 
0
source share

I ran into the same problem.

Quick and dirty solution

 tree.ItemsSource = null; tree.ItemsSource = yourSource; 
0
source share
 TreeViewItem tvi = tvMain.ItemContainerGenerator.ContainerFromIndex(0) as TreeViewItem; if (tvi != null) { tvi.IsSelected = true; tvi.IsSelected = false; } 
0
source share

All Articles