web-dev-qa-db-fra.com

Dans C # WPF, pourquoi l'événement SelectionChanged de mon TabControl se déclenche-t-il trop souvent?

J'ai une interface graphique à onglets avec chaque onglet contenant un cadre. Dans l'un de ces cadres, il y a un DataGrid. Lorsque l'utilisateur sélectionne cet onglet, j'ai besoin que ma grille de données soit triée, j'utilise donc l'événement TabControl SelectionChanged pour déclencher le tri. Cependant, cet événement se déclenche chaque fois qu'un élément est sélectionné dans le DataGrid, même si les onglets eux-mêmes restent intacts.

J'ai essayé un certain nombre d'événements différents: GotFocus pour un TabItem RequestBringIntoView pour un TabItem

mais ils semblent tous souffrir de ce problème. Qu'est-ce qui cause cela?

51
Anders

Le TabControl.SelectionChanged est le même événement qu'un ComboBox.SelectionChanged

Il provient de Selector.SelectionChanged .

Donc, si vous ne marquez pas votre événement comme géré dans votre gestionnaire d'événements, il bouillonnera dans l'arborescence et finira par arriver à votre TabControl, ce qui provoque ce problème de "déclenchement trop fréquent".

Marquez votre événement comme géré dans votre SelectionChanged de votre ComboBox/ListBox/ListView/tout autre sélecteur que vous utilisez dans votre DataGrid comme ceci:

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

Et cet inconvénient disparaîtra;).

89
Arcturus

Si vous avez ajouté un gestionnaire avec AddHandler dans un élément parent, toutes les modifications de sélection déclencheront l'événement SelectionChanged. Dans ce cas, vous pouvez donner un nom à votre TabControl, puis vérifier dans EventHandler si le nom de l'OriginalSource est le nom de votre TabControl.

2
HCL

Une autre bonne approche consiste à ajouter un gestionnaire à 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();
}

Ce n'est peut-être pas la manière familiale, mais c'est moins douloureux car il ne se déclenche que lorsqu'un élément est changé.

2
Shimmy