您的问题让我感到困惑,因为 SelectedItemChanged 事件是 TreeView 事件,而不是 TreeViewItem 事件。 “嘿伙计,我的活动远不及你的活动!”
当所选项目发生变化时,TreeView 会在自身、TreeView 和如果未处理上引发SelectedItemChanged 事件,它开始向页面的根元素。
当您需要证明时,编写一个小型测试程序会有所帮助。
这是一个包含在Grid 中的小TreeView:
<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 处理程序。
当事情没有按照您认为的那样运行时,请尝试使用小型测试程序。做实验并找到问题的核心要容易得多!