WPF DataGrid Virtualización con agrupamiento

Estoy usando WPF DataGrid de CodePlex y necesito que la virtualización funcione con la agrupación.

Esta pregunta es sobre el tema y apunta a un ejemplo de MSDN, pero solo cubre ListControls con plantillas de datos simples (es decir, una sola columna).

Agrupación y virtualización parece ser un caso de uso bastante común para una cuadrícula. ¿Hay una manera estándar / recomendada / simple de poner esto en marcha?

Me doy cuenta de que llego tarde a la fiesta aquí … pero me encontré con este problema recientemente (usando el DataGrid integrado en .NET 4). Lamentablemente, todavía no hay virtualización de las filas una vez que se usa Agrupamiento en DataGrid … pero encontré un truco de mejora del rendimiento muy ingenioso que esperamos que alguien más también encuentre útil.

Suponiendo que está utilizando un ItemsPresenter dentro de un expansor de la plantilla de su GroupItem y de manera predeterminada su expansor no está expandido, intente simplemente vinculando la visibilidad de su ItemsPresenter a la propiedad IsEnabled del expansor con BooleanToVisibilityConverter por defecto:

        

Si se encuentra con el problema por el que su DataGrid tarda mucho en cargarse (porque esencialmente extrae todos los registros de su cuadrícula de datos aunque esté en un expansor colapsado) … entonces, al usar el código anterior, la cuadrícula de datos no dibujará sus registros hasta que expanda un grupo, y luego, solo extraerá los registros para ese grupo en particular.

El inconveniente es que esto solo ayuda si los expansores se colapsan de manera predeterminada, y aún así las filas no se virtualizan (si tiene 100 elementos en un grupo expandido, pero solo 20 caben en la pantalla, los 100 se dibujarán en el vez que expandiste el grupo).

Lo bueno es que básicamente has implementado la carga diferida de tus registros de DataGrid, por lo que no estás realizando el trabajo de dibujo hasta que realmente necesites ver los elementos (eliges expandir el grupo). Para mi producto, mi encabezado de grupo tenía botones incorporados para realizar operaciones en todos los elementos dentro de su grupo, por lo que con más frecuencia el usuario nunca expandió un grupo a menos que necesitaran realizar una operación en un elemento individual dentro de un grupo.

* Una cosa a tener en cuenta si usas este truco es que probablemente debas establecer anchos explícitos o anchuras mínimas en los encabezados de tus columnas (porque los elementos no se dibujan cuando DataGrid se carga por primera vez, por lo que los encabezados de las columnas no pueden ít).

Esperemos que la verdadera virtualización se implemente en un futuro service pack, pero si no, ¡espero que esto ayude a otra persona!

Actualizar

Parece que este problema se solucionará en .NET 4.5 con una nueva propiedad adjunta VirtualizingPanel.IsVirtualizingWhenGrouping .

Hay una nueva propiedad adjunta en el marco 4.5 VirtualizingPanel.IsVirtualizingWhenGrouping , que permite activar la virtualización al agrupar.

  

No hay una característica incorporada que le permita habilitar la virtualización de la interfaz de usuario cuando la agrupación está habilitada en un ListView o DataGrid. Si lo piensa por un segundo, también tiene sentido. ¿Cómo es DataGrid para agrupar elementos que no existen? Para aplicar la agrupación, el control debería cargar toda la colección, lo que vencería el objective de la virtualización. Lo mejor que probablemente pueda hacer es proporcionar algún tipo de virtualización en su modelo de vista (el objeto que une) en el que solo proporciona los datos que se necesitan actualmente más algún tipo de datos generics sobre la cantidad de datos que existen y luego falsos la vista a ti mismo

Con la agrupación podría ser algo como esto: cuando la agrupación está habilitada inicialmente, todos los grupos se colapsarían. Por lo tanto, su modelo de vista solo debería proporcionar un elemento para cada grupo que haya. Solo para asegurarse de que la vista contiene todos los grupos existentes. Tan pronto como el usuario expanda un grupo, ViewModel rellenará dinámicamente los elementos para ese grupo. Esta es una forma muy simple y básica de virtulización y no es óptima, pero podría ser un buen punto de partida para. Es solo para ilustrar el enfoque.

Como dijiste, habilitando Agrupar deshabilitará la virtualización de UI.

No creo que encuentres una manera fácil de resolver este problema. Te recomendaría que compruebes uno de los WPF DataGrid disponibles, como el XCeeed que podría tener esta característica incorporada bajo su control.