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 Widgets 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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top