In C# WPF, why is my TabControl's SelectionChanged event firing too often?

前端 未结 4 1485
小鲜肉
小鲜肉 2020-11-30 02:41

I have a tabbed GUI with each tab containing a Frame. In one of these Frames there is a DataGrid. When the user selects this tab, I need my datagrid sorted, so I\'m using th

相关标签:
4条回答
  • 2020-11-30 03:25

    If you have added a handler with AddHandler in a parent element, all selection changes will fire the SelectionChanged-event. In this case, you can give your TabControl a name and then check in the EventHandler if the name of the OriginalSource is the name of your TabControl.

    0 讨论(0)
  • 2020-11-30 03:30

    Another good approch is adding a handler to the 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();
    }
    

    Maybe is not the xamly way, but is less pain as it only fires when an item is changed.

    0 讨论(0)
  • 2020-11-30 03:37
         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
                    }
                }
            }
    
    0 讨论(0)
  • 2020-11-30 03:42

    The TabControl.SelectionChanged is the same event as a ComboBox.SelectionChanged

    It originates from Selector.SelectionChanged.

    So, if you do not mark your event as handled in your event handler, it will bubble up the tree, and eventually arrive at your TabControl, which is causing this "firing too often" issue.

    Mark your event as handled in your SelectionChanged of your ComboBox/ListBox/ListView/any other Selector you use in your DataGrid like so:

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

    And this inconvenience will go away ;).

    0 讨论(0)
提交回复
热议问题