В С# WPF, почему слишком часто срабатывает событие TabControl SelectionChanged?
У меня есть графический интерфейс с вкладками с каждой вкладкой, содержащей Frame. В одном из этих фреймов есть DataGrid. Когда пользователь выбирает эту вкладку, мне нужен мой сортимент данных, поэтому я использую событие TabControl SelectionChanged для запуска сортировки. Однако это событие запускается каждый раз, когда элемент выбирается из DataGrid, даже если сами вкладки остаются нетронутыми.
Я пробовал несколько различных событий:
GotFocus для TabItem
RequestBringIntoView для TabItem
но все они, похоже, страдают от этой проблемы. Что вызывает это?
Ответы
Ответ 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-способ, но меньше боли, поскольку он срабатывает только при изменении элемента.