Ваш вопрос озадачивает меня, потому что событие SelectedItemChanged
является событием TreeView
, а не TreeViewItem
. «Эй, чувак, мое мероприятие не было близко к вашему мероприятию!»
Когда выбранный элемент изменяется, TreeView
вызывает событие SelectedItemChanged
для самого , TreeView
и , если не обработано , оно начинает пузыриться к корневому элементу страницы.
Написание небольшой тестовой программы помогает, когда вам нужны доказательства.
Вот небольшой TreeView
, содержащийся в 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>
и вот код для теста:
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));
}
и запуск его и нажатие на первый элемент приводит к выводу отладки:
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
, который показывает, что событие вызывается на самом TreeView
, а установка e.Handled
на true
предотвращает получение события Grid
. Прокомментируйте эту строку и она всплывет до Grid
.
Но ни в коем случае TreeViewItem
никогда не вызывал обработчик SelectedItemChanged
.
Попробуйте использовать небольшие тестовые программы, когда все идет не так, как вы думаете. Гораздо проще проводить эксперименты и разобраться в сути проблемы!