In C # WPF, perché l’evento SelectionChanged di TabControl viene triggersto troppo spesso?

Ho una GUI a tabs con ogni scheda contenente un frame. In uno di questi frame c’è un DataGrid. Quando l’utente seleziona questa scheda, ho bisogno del mio datagrid ordinato, quindi sto usando l’evento SelectionChanged di TabControl per triggersre l’ordinamento. Tuttavia, questo evento si triggers ogni volta che un elemento viene selezionato da DataGrid, anche se le tabs stesse rimangono intatte.

Ho provato il numero di diversi eventi: GotFocus per TabItem RequestBringIntoView per TabItem

ma sembrano tutti soffrire di questo problema. Che cosa sta causando questo?

TabControl.SelectionChanged è lo stesso evento di ComboBox.SelectionChanged

Deriva da Selector.SelectionChanged .

Quindi, se non contrassegni il tuo evento come gestito nel gestore di eventi, esso bolla l’albero e alla fine arriva al tuo TabControl , che causa questo problema di “accensione troppo spesso”.

Contrassegna il tuo evento come gestito nel tuo SelectionChanged del tuo ComboBox / ListBox / ListView / qualsiasi altro Selettore che usi in DataGrid in questo modo:

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

E questo inconveniente andrà via;).

      private void tabControlName_SelectionChanged (mittente dell'object, SelectionChangedEventArgs e)
         {
             se (e.Source è TabControl) // se questo evento è stato triggersto da TabControl, quindi immettere
             {
                 if (tabItemName.IsSelected)
                 {
                     // Fai il tuo lavoro qui
                 }
             }
         }

Se hai aggiunto un gestore con AddHandler in un elemento genitore, tutte le modifiche alla selezione triggersno l’evento SelectionChanged. In questo caso, puoi assegnare a TabControl un nome e quindi controllare EventHandler se il nome di OriginalSource è il nome di TabControl.

Un altro buon approcio è l’aggiunta di un gestore a 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(); } 

Forse non è il modo xamly, ma è meno doloroso in quanto spara solo quando un object viene cambiato.