60

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

我尝试了许多不同的事件:GotFocus for a TabItem RequestBringIntoView for a TabItem

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

4

4 回答 4

101

TabControl.SelectionChangeda 相同的事件ComboBox.SelectionChanged

它起源于Selector.SelectionChanged.

因此,如果您没有在事件处理程序中将您的事件标记为已处理,它会在树中冒泡,并最终到达您的TabControl,这会导致这个“触发过于频繁”的问题。

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

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

这种不便将消失;)。

于 2010-09-07T15:07:51.737 回答
28
     私人无效tabControlName_SelectionChanged(对象发送者,SelectionChangedEventArgs e)
        {
            if (e.Source is TabControl) //如果此事件是从 TabControl 触发的,则输入
            {
                if (tabItemName.IsSelected)
                {
                    //在这里做你的工作
                }
            }
        }
于 2011-04-23T12:40:03.900 回答
3

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

于 2010-09-07T15:10:43.530 回答
2

另一个好的方法是向 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();
}

也许不是 xamly 方式,但痛苦较小,因为它仅在更改项目时触发。

于 2010-11-16T12:44:07.877 回答