在C#WPF中,为什么我的TabControl的SelectionChanged事件经常发射?

我有一个选项卡式GUI,每个选项卡包含一个框架。 在其中一个框架中有一个DataGrid。 当用户select这个选项卡,我需要我的数据网格sorting,所以我使用TabControl SelectionChanged事件触发sorting。 但是,每次从DataGrid中select一个项目时都会触发此事件,即使这些标签本身保持不变。

我已经尝试了多个不同的事件:GotFocus为TabItem的一个TabItem的RequestBringIntoView

但他们似乎都受到这个问题的困扰。 这是什么原因造成的?

TabControl.SelectionChangedComboBox.SelectionChanged是相同的事件

它来自Selector.SelectionChanged

所以,如果你不把你的事件标记为在你的事件处理程序中处理,它会冒泡树,并最终到达你的TabControl ,这导致这个“频繁发射”的问题。

将您的事件标记为在您的DataGrid中使用的ComboBox / ListBox / ListView /任何其他select器的SelectionChanged中,如下所示:

 private void MyComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e) { e.Handled = true; } 

而这种不便将会消失;)。

     私人无效tabControlName_SelectionChanged(对象发件人,SelectionChangedEventArgs e)
         {
            如果(e.Source是TabControl)//如果从TabControl触发此事件,则input
             {
                如果(tabItemName.IsSelected)
                 {
                     //在这里做你的工作
                 }
             }
         }

如果在父元素中添加了具有AddHandler的处理程序,则所有select更改都将触发SelectionChanged事件。 在这种情况下,您可以给TabControl一个名称,然后检查EventHandler,如果该OriginalSource的名称是您的TabControl的名称。

另一个很好的方法是向tabControl.Items.SelectionChanged添加一个处理程序:

 private void Window_Loaded(object sender, RoutedEventArgs e) { ItemCollection view = tabControl.Items; view.CurrentChanged += new EventHandler(view_CurrentChanged); } void view_CurrentChanged(object sender, EventArgs e) { throw new NotImplementedException(); } 

也许不是一种折衷的方式,但是不那么痛苦,因为只有当一件物品被改变时才会发生。