2010-09-07 20 views
45

Tengo una GUI con pestañas con cada pestaña que contiene un Marco. En uno de estos marcos hay un DataGrid. Cuando el usuario selecciona esta pestaña, necesito que mi cuadrícula de datos esté ordenada, por lo que estoy usando el evento TabControl SelectionChanged para activar la ordenación. Sin embargo, este evento se desencadena cada vez que se selecciona un elemento del DataGrid, aunque las pestañas permanezcan intactas.En C# WPF, ¿por qué el evento SelectionChanged de mi TabControl se activa con demasiada frecuencia?

He intentado número de diferentes eventos: GotFocus para un TabItem RequestBringIntoView para un TabItem

pero todos ellos parecen sufrir de este problema. ¿Qué está causando esto?

Respuesta

78

El TabControl.SelectionChanged es el mismo evento como ComboBox.SelectionChanged

Se origina en Selector.SelectionChanged.

lo tanto, si usted no marca el evento como se maneja en el controlador de eventos, se brotan del árbol, y, finalmente, llegar a su TabControl, que está causando este problema "disparar con demasiada frecuencia".

Marque su evento como manejó en su SelectionChanged de su ComboBox/ListBox/ListView/cualquier otro selector que utiliza en su cuadrícula de datos, así:

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

Y este inconveniente desaparece;).

+12

Tendría que manejar cada selector en cada una de sus páginas de pestañas. Es mucho más fácil simplemente mirar y ver si e.OriginalSource es un control de pestañas. –

+1

Cierto, pero sería más claro, si solo marcó su evento como manejado cuando el selector está hecho con él. :) – Arcturus

+12

Muchas gracias por señalar el problema. En cuanto a la solución, terminé agregando "if (e.OriginalSource es System.Windows.Controls.TabControl)" a mi evento TabControl.SelectionChanged para no tener que crear un controlador de eventos para mi Datagrid. – Anders

2

Si ha agregado un controlador con AddHandler en un elemento primario, todos los cambios de selección desencadenarán el evento SelectionChanged. En este caso, puede darle un nombre a su TabControl y luego verificar en el Manejador de eventos si el nombre de la fuente original es el nombre de su TabControl.

+0

En el controlador OnSelectedChanged, '' if (Iguala (remitente, e.OriginalSource)) {/ * hacer el trabajo * /} '' luego todos los niños los eventos no entrarán en el bloque condicional –

2

Otra buena approch es la adición de un controlador a la 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(); 
} 

Tal vez no es la forma xamly, pero es menos dolor ya que sólo se activa cuando se cambia un elemento.

21
 
    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 
       } 
      } 
     } 
+0

Estoy usando controles de pestañas hijo dentro del control de la pestaña Principal, ¿podemos verificar por ** TabName ** usando esta condición? (e.Source es TabControl) '? –

+0

En mi opinión, es mejor que compruebe e.OriginalSource que e.Source. –

Cuestiones relacionadas