¿Mejores prácticas de WPF DataGrid?
-
10-07-2019 - |
Pregunta
Estoy trabajando en una aplicación WPF basada en MVVM que utiliza el DataGrid
.La cuadrícula está vinculada a datos a un ObservableCollection<Widget>
(el Widget
lista).El usuario debe poder insertar un Widget
en la lista debajo del seleccionado actualmente Widget
, para eliminar un seleccionado Widget
, y reordenar el Widget
s en la cuadrícula.Implementaré el reordenamiento arrastrando y soltando.
Antes de profundizar en esto, quiero comprobar la realidad de mi enfoque.Esto es lo que planeo hacer:El Widget
la clase tendrá un Index
propiedad que será utilizada para ordenar el Widget
lista.Las adiciones, eliminaciones y reordenamientos se realizarán manipulando esta propiedad de Índice, y la clasificación se realizará según el Widget
lista, en lugar de a través de una CollectionView
.
Antes de DataContext
está establecido, el Widget
La lista se ordenará según el Index
propiedad.Cuando un usuario agrega un Widget
, el Index
La propiedad se incrementará en 1 por cada Widget
debajo del elemento seleccionado en la cuadrícula, y el nuevo Widget
recibirá el número de índice abierto por la renumeración.El Widget
Se recurrirá a la lista y se actualizarán los enlaces.
Cuando un usuario elimina un Widget
, el Widget
será eliminado de la lista y el Index
La propiedad de los elementos en la cuadrícula debajo del elemento eliminado se reducirá en 1.El Widget
Se recurrirá a la lista y se actualizarán los enlaces, como se indicó anteriormente.El reordenamiento se realizará como una combinación de eliminar e insertar.
Aquí está mi pregunta:¿Es esta una estrategia razonable para implementar la inserción, eliminación y reordenamiento?¿Existe una mejor manera de hacerlo?¿Algún buen artículo o publicación de blog sobre el tema?He mirado, pero no se me ocurre nada concreto.
Gracias por tu ayuda.
Solución
Tengo este problema resuelto. Necesito la propiedad Index, pero no necesito ordenar la ObservableCollection. Creo una interfaz, IIndexedObject, con una propiedad, Index. Implemento esa interfaz en cualquier objeto que necesite indexarse, y en mi tabla de base de datos, agrego una columna de índice.
Cuando cargo en mi modelo de objetos, clasifico la tabla de la base de datos en la propiedad Índice. Eso asegura que la lista se cargue en el mismo orden que en la última ejecución. Agrego objetos usando la fila en blanco proporcionada en la parte inferior de DataGrid. Les da un índice de 0. Elimino objetos usando un botón Eliminar vinculado a un ICommand en el modelo de vista.
Mi modelo de vista se suscribe a la propiedad CollectionChanged de cualquier ObservableCollection que contiene IIndexedObjects. Cuando se desencadena el evento, el modelo de vista pasa la colección a un método de servicio ReIndexCollection, que toma un objeto IIndexedObject. El método vuelve a indexar la colección, en función de su orden actual, simplemente iterando la colección, asignando un valor entero incremental a la propiedad Index de cada elemento. Cuando insisto en que la colección vuelva a la base de datos, el valor del índice se guarda para garantizar que la colección se cargue en el mismo orden en la próxima ejecución.
Dado que la única clasificación que se necesita se realiza en la carga de la base de datos, no es necesario ordenar la colección ObservableCollection. Cuando muevo elementos en DataGrid, se encargará de reordenar la colección en ese momento. Todo lo que tengo que hacer es volver a indexar la colección, para que su orden vuelva a la base de datos.
En general, es mucho más fácil de lo que esperaba. Una de las razones por las que me gusta WPF y MVVM.
Otros consejos
Mejora del rendimiento de clasificación: http: //blogs.msdn.com/jgoldb/archive/2008/10/30/improving-microsoft-datagrid-sorting-performance-part-3.aspx