Почему в C # WPF мое событие TabControl SelectChanged срабатывает слишком часто? - PullRequest
51 голосов
/ 07 сентября 2010

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

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

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

Ответы [ 4 ]

87 голосов
/ 07 сентября 2010

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

Происходит от Selector.SelectionChanged.

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

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

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

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

24 голосов
/ 23 апреля 2011
     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
                }
            }
        }
2 голосов
/ 16 ноября 2010

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

2 голосов
/ 07 сентября 2010

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

...