Introduction
WPF TreeView
control does not give developers an ability to multi-select the nodes of the tree. This article shows a very simple example that simulates multi-select capability for a WPF TreeView
control. I say "simulate" because it discards the WPF select mechanism and replaces it with its own.
Ideally another user control called, say MultiSelectTreeView
, should be created and packed in a separate DLL, but since I do not have much time to spend on it, I simply showed how to do it by modifying the code in the main Window
class.
To multi-select, you should use the left ctrl key on your keyboard together with the mouse. The shift key and ctrl-A multi-select functions were not added (again for the lack of time), but can be added in exactly the same manner.
Simulating the Multi-Selection
As stated above, we disable the WPF selection and, instead use our own selection mechanism, according to which, all TreeViewItem
elements that have been selected are stored in selectedItems
set. The set is simulated by a Dictionary
with null
values.
The selected items change their Background
and Foreground
properties to Brushes.Black
and Brushes.White
correspondingly.
If LeftCtrl
key is not pressed, then, before selecting an item, we clean all the previous selections. If LeftCtrl
key is pressed, the previous selections are not cleaned.
Using the Code
The top level code is located in MyTreeView_SelectedItemChanged
function and called when SelectedItemChanged
event is fired on the TreeView
.
First, prevent WPF selection:
treeViewItem.IsSelected = false;
Then, if LeftCtrl
is not pressed, clear the previous selections:
if (!CtrlPressed)
{
List selectedTreeViewItemList = new List();
foreach (TreeViewItem treeViewItem1 in selectedItems.Keys)
{
selectedTreeViewItemList.Add(treeViewItem1);
}
foreach (TreeViewItem treeViewItem1 in selectedTreeViewItemList)
{
Deselect(treeViewItem1);
}
}
Then, flip flop the selection state of the item: if selected, make it unselected and vice versa:
ChangeSelectedState(treeViewItem);
We check whether LeftCtrl
key is pressed or not by implementing the following property:
bool CtrlPressed
{
get
{
return System.Windows.Input.Keyboard.IsKeyDown(Key.LeftCtrl);
}
}
History
- 23rd March, 2008: Initial post