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!