Your question puzzles me because the SelectedItemChanged event is a TreeView event, not a TreeViewItem event. "Hey man, my event was far from your event!"
When the selected item changes, the TreeView raises the SelectedItemChanged event on , TreeView , and if it is raw, it begins to pop up to the root element of the page.
Writing a small test program helps when you need proof.
Here's the little TreeView contained in the 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 is the code 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 on the first element, you get 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 event from being received. Comment on the row coming out and it bubbles up to the Grid .
But in no case does the TreeViewItem a SelectedItemChanged handler.
Try using small test programs if something is not what you think. Itβs much easier to do experiments and get to the bottom of the problem!