Your question mystifies me because the SelectedItemChanged
event is a TreeView
event, not a TreeViewItem
event. "Hey man, my event was nowhere near your event!"
When the selected item changes, the TreeView
raises the SelectedItemChanged
event on itself, the TreeView
, and if unhandled it begins bubbling up towards the root element of the page.
Writing a small test program helps when you want proof.
Here's a small TreeView
contained in a Grid
:
<Grid TreeView.SelectedItemChanged="Grid_SelectedItemChanged">
<TreeView SelectedItemChanged="TreeView_SelectedItemChanged">
<TreeViewItem TreeView.SelectedItemChanged="TreeViewItem_SelectedItemChanged" Header="Item1">
<TreeViewItem TreeView.SelectedItemChanged="TreeViewItem_SelectedItemChanged" Header="Item2">
<TreeViewItem TreeView.SelectedItemChanged="TreeViewItem_SelectedItemChanged" Header="Item3"/>
</TreeViewItem>
</TreeViewItem>
</TreeView>
</Grid>
and here's the code-behind for the test:
private void Grid_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
SelectedItemChanged(sender, e, "Grid");
}
private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
SelectedItemChanged(sender, e, "TreeView");
e.Handled = true;
}
private void TreeViewItem_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
SelectedItemChanged(sender, e, "TreeViewItem");
}
private void SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e, string handler)
{
Debug.WriteLine("");
Debug.WriteLine(string.Format("SelectedItemChanged: handler = {0}", handler));
Debug.WriteLine(string.Format("e.NewValue.Header = {0}", (e.NewValue as TreeViewItem).Header));
Debug.WriteLine(string.Format("sender = {0}", sender));
Debug.WriteLine(string.Format("e.Source = {0}", e.Source));
Debug.WriteLine(string.Format("e.OriginalSource = {0}", e.OriginalSource));
}
and running it and clicking the first item produces this debug output:
SelectedItemChanged: handler = TreeView
e.NewValue.Header = Item1
sender = System.Windows.Controls.TreeView Items.Count:1
e.Source = System.Windows.Controls.TreeView Items.Count:1
e.OriginalSource = System.Windows.Controls.TreeView Items.Count:1
which shows that the event is raised on the TreeView
itself and setting e.Handled
to true
prevents the Grid
from receiving the event. Comment that line out and it does bubble up to the Grid
.
But in no case does the TreeViewItem
ever have the SelectedItemChanged
handler called.
Try using small test programs when things are not behaving as you think they should. It's much easier to do experiments and get to the heart of the problem!