datagrid silverlight-2.0

Selección automática Silverlight DataGrid al establecer ItemSource/DataContext, clasificación,



silverlight-2.0 (5)

¿Hay alguna forma de desactivar la selección automática de la primera fila en el DataGrid incorporado en Silverlight?

Construimos muchas funcionalidades basadas en que el usuario seleccione una fila en una cuadrícula de datos. La activación automática de SelectionChanged cuando el enlace de datos o la clasificación realmente nos está causando problemas. Hemos tratado de poner algunos guardias alrededor de la selección, pero parece que no se cubren todos los problemas.

Por ejemplo, si tiene DataGrid en una pestaña de un TabControl que no se muestra al cargar la pantalla y DataGrid tiene un enlace a una propiedad del DataContext que es una lista de objetos. La cuadrícula no está vinculada a datos hasta que se muestre la pestaña. ¿Hay algún evento que nos diga que la red es un enlace de datos? ¿No debería el comportamiento predeterminado de enlace de datos no seleccionar una fila?

Gracias Mike


Micro,

He resuelto este problema envolviendo el control de Windows y atrapando el evento de selección de la cuadrícula de ventanas envueltas.

En su control, conecte el evento Loaded de su control, y cuando esté cargado, establezca una variable de miembro privada booleana en verdadero. Luego, cuando esté capturando el evento de selección de la cuadrícula de datos internos, solo eleve su propio evento de cambio de selección si su control está cargado. Una vez hecho esto, puede volver al sub OnApplyTemplate, y establecer el índice seleccionado de la grilla de datos interna a -1 y el elemento seleccionado a nada. Dado que la configuración del índice y el elemento ocurrirá antes de que su control termine de cargarse, el evento de selección no se disparará. Intenté esto en un entorno con pestañas y sin pestañas, y parece funcionar sin problemas. Ahora, a un problema un poco más difícil, es posible que haya notado que cuando ordena la cuadrícula de datos de Windows (mientras está vinculado a un ItemsSource) siempre selecciona el ítem superior de los datos mostrados. Por supuesto, esto disparará el evento de selección de cambio, y pasará a un elemento que no se había seleccionado previamente, y por lo que puedo ver, no debería seleccionarse. Para manejar esto, tendrás que hacer una codificación un poco más complicada. Si observa, cuando capta el evento de selección de la cuadrícula interior y mira el elemento seleccionado, hay solo unos pocos casos en los que el elemento seleccionado no está configurado en nada, es decir, cuando ya no hay un elemento seleccionado (es decir, .la selección se borra), o cuando (HINT) las columnas están clasificando. Cuando está ordenando, hay dos eventos que se desencadenan, el primero es la des-selección del elemento (SelectedItem es Nothing) y el segundo es la selección del elemento superior en la lista (SelectedIndex 0). Ahora, si pusiera una bandera en el controlador de eventos para el evento de selección de redes internas cambiadas, y entendiera que el elemento no es nada, podría hacer un seguimiento del elemento seleccionado previamente y luego establecer el elemento seleccionado de la cuadrícula de datos internos al elemento seleccionado previamente.

Esto soluciona el problema decentemente bien, y como siempre puede haber resultados no deseados al envolver un control de Windows, pero hasta donde puedo decir, esta parece ser la única forma de evitar la primera fila que se selecciona en el problema de carga. Solo puedo imaginar, sin embargo, que M $ lo va a arreglar en algún momento.

Espero que esto ayude,

Gracias,

Scott


¿Has intentado establecer un campo booleano (por ejemplo, bool dataGridFirstLoad) que estableces como falso en el constructor de tu Control de usuario.

Luego, en el evento SelectionChanged de DataGrid, verifique si dataGridFirstLoad es falso. Si falso se establece en verdadero y establece SelectedItem en nulo.

Espero que esto ayude.


El código siguiente debería hacerlo (establezca JustRefreshed en true siempre que actualice / actualice la cuadrícula):

int LastSelectedIndex = -1; bool JustRefreshed = false; private void dataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (JustRefreshed) { JustRefreshed = false; dataGrid.SelectedIndex = LastSelectedIndex; return; } if (e.AddedItems.Count > 0) { LastSelectedIndex = dataGrid.SelectedIndex; } //Your logic comes here... } }


esto es similar a las publicaciones anteriores (y resume la sugerencia de Paulo T). Esto funciona bien // establece el manejador de cambios de selección en el xaml o en el constructor // Tengo 2 rejillas en mi página, así que creo una propiedad booleana para cada

private bool IsFirstLoad { get; set; } private bool IsFirstLoadDetails { get; set; } public BookDisplay() { //code here this.IsFirstLoad = true; this.IsFirstLoadDetails = true; BindBooks(); //define this function (not in this snippet for the sake of brevity) } private void GridBooks_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (this.IsFirstLoad) { GridBooks.SelectedItem = -1; this.IsFirstLoad = false; } else { //do your stuff } } private void GridBooksWithDetails_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (this.IsFirstLoadDetails) { GridBooksWithDetails.SelectedItem = -1; this.IsFirstLoadDetails = false; } }


Como el código de DataGrid estaba disponible desde Microsoft, eliminamos la selección, por lo que no tuvimos que evitarlo. Creo que esto ya no es un problema con la grilla de Silverlight 3.0.