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

And*_*ers 54 c# wpf tabcontrol tabitem

我有一个标签式GUI,每个标签包含一个框架.在其中一个框架中有一个DataGrid.当用户选择此选项卡时,我需要对datagrid进行排序,因此我使用TabControl SelectionChanged事件来触发排序.但是,每次从DataGrid中选择一个项时,此事件都会触发,即使选项卡本身保持不变.

我尝试了很多不同的事件:GotFocus用于TabItem的TabItem RequestBringIntoView

但他们似乎都遇到了这个问题.是什么造成的?

Arc*_*rus 91

TabControl.SelectionChanged相同事件作为ComboBox.SelectionChanged

它起源于Selector.SelectionChanged.

因此,如果您没有将事件标记为在事件处理程序中处理,它将冒泡树,并最终到达您的TabControl,这导致这种"解雇太频繁"的问题.

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

private void MyComboBox_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)

这种不便将消失;).

  • 然后他必须在每个标签页上处理每个选择器.只需查看e.OriginalSource是否为Tab控件就更容易了. (15认同)
  • 非常感谢你指出这个问题.至于解决方案,我最终将"if(e.OriginalSource是System.Windows.Controls.TabControl)"添加到我的TabControl.SelectionChanged事件中,因此我不必为我的Datagrid创建事件处理程序. (14认同)
  • FYI如果你遇到这个:不要只检查OriginalSource的类型 - 检查以确保OriginalSource实际引用你的特定TabControl:"if(ReferenceEquals(e.OriginalSource,this.myTabControl)".如果你没有,那么所有子选项卡控件将激活您的事件处理程序代码. (9认同)

Tow*_*hid 25

     private void tabControlName_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if (e.Source is TabControl) //if this event fired from TabControl then enter
            {
                if (tabItemName.IsSelected)
                {
                    //Do your job here
                }
            }
        }

  • 在我看来,你最好检查 e.OriginalSource 而不是 e.Source。 (2认同)