GridViewColumnHeader.Click activado al hacer clic en el eje de la barra de desplazamiento de ListView y en las flechas de desplazamiento

Estoy usando comportamientos adjuntos para agregar la capacidad de ordenar un ListView haciendo clic en el encabezado de una columna. El comportamiento agrega el siguiente controlador para controlar al usuario que hace clic en un GridViewColumnHeader:

listView.AddHandler(GridViewColumnHeader.ClickEvent, new RoutedEventHandler(ColumnHeader_Click));

El controlador se parece a esto:

static void ColumnHeader_Click(object sender, RoutedEventArgs e)
{
   var listView = sender as ListView;
   var header = e.OriginalSource as GridViewColumnHeader;
   var gridView = ((GridView)(listView.View));
   ...
}

Me acabo de dar cuenta de que si ListView tiene una barra de desplazamiento, y hago clic en el 'eje' de la barra de desplazamiento o en las flechas de desplazamiento (¡pero no en el pulgar!):

Anatomía de una barra de desplazamiento
(fuente: microsoft.com)

luego se activa GridViewColumnHeader.ClickEvent, y mi código falla porque el 'encabezado' ahora es nulo. Obviamente, este no es un comportamiento esperado, y ahora debo asegurarme de que OriginalSource sea un GridViewColumnHeader.

¿Por qué sucede esto?

preguntado el 03 de mayo de 12 a las 16:05

1 Respuestas

El problema es, GridViewColumnHeader.ClickEvent en realidad es ButtonBase.ClickEvent, lo que significa que el controlador que establezca se activará cuando un usuario haga clic en cualquier botón (o derivado: casilla de verificación, selector de fechas, botón de barra de desplazamiento, etc.) en ListView, y no solo en un encabezado de columna (que se deriva de botón).

Vea http://social.msdn.microsoft.com/Forums/en/wpf/thread/3595d153-4faa-4501-9c6f-2f074658e760

La única solución que he encontrado es comprobar que header != null antes de hacer cualquier otra cosa, para salir del controlador cuando el botón que lo activó (e.OriginalSource) no era un encabezado de columna.

Espero que esto ayude...

(PD: también verifique si header.Column != null, para evitar un error cuando el usuario hace clic en el "último encabezado adicional", el encabezado vacío a la derecha de todos los encabezados "normales"...)

contestado el 11 de mayo de 12 a las 15:05

Gracias por la PD, no me di cuenta de eso y el problema estaba presente en nuestro código. - Yazan Al-Alul

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.