Подтвердить что ты не робот

В С# WPF, почему слишком часто срабатывает событие TabControl SelectionChanged?

У меня есть графический интерфейс с вкладками с каждой вкладкой, содержащей Frame. В одном из этих фреймов есть DataGrid. Когда пользователь выбирает эту вкладку, мне нужен мой сортимент данных, поэтому я использую событие TabControl SelectionChanged для запуска сортировки. Однако это событие запускается каждый раз, когда элемент выбирается из DataGrid, даже если сами вкладки остаются нетронутыми.

Я пробовал несколько различных событий: GotFocus для TabItem RequestBringIntoView для TabItem

но все они, похоже, страдают от этой проблемы. Что вызывает это?

4b9b3361

Ответ 1

TabControl.SelectionChanged - это то же событие, что и ComboBox.SelectionChanged

Он исходит из Selector.SelectionChanged.

Итак, если вы не помечаете свое событие как обработанное в обработчике событий, оно будет пузыриться по дереву и, в конце концов, придет к вашему TabControl, что вызывает эту проблему слишком часто "сжигания".

Отметьте свое событие как обработанное в вашем SelectionChanged вашего ComboBox/ListBox/ListView/любого другого Селектора, который вы используете в своем DataGrid, например:

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

И это неудобство исчезнет;).

Ответ 2

     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
                }
            }
        }

Ответ 3

Если вы добавили обработчик с AddHandler в родительский элемент, все изменения выбора будут запускать событие SelectionChanged. В этом случае вы можете дать своему TabControl имя и затем проверить EventHandler, если имя OriginalSource является именем вашего TabControl.

Ответ 4

Другим хорошим утверждением является добавление обработчика к 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-способ, но меньше боли, поскольку он срабатывает только при изменении элемента.