В C# WPF почему событие SelectionChanged моего TabControl запускается слишком часто?

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

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

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

4 ответов


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

происходит из Selector.SelectionChanged.

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

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

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

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


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

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


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