Estoy usando el WPF DataGrid desde CodePlex y necesito conseguir la Virtualización a trabajar con la agrupación.

Este pregunta es en el tema y apunta a un Ejemplo de MSDN pero solo cubre ListControls con simples (es decir, un único ‘columna’) DataTemplates.

Agrupación de Virtualización y parece algo bastante común en caso de uso de una Cuadrícula. Hay un estándar/recomendado/forma sencilla de llegar esta pasando?

4 Comentarios

  1. 34

    Me doy cuenta de que llego tarde a la fiesta aquí… pero me encontré con este problema recientemente (utilizando el DataGrid construido en .NET 4). Por desgracia, todavía no hay la virtualización de las filas una vez que la Agrupación se usa en el control DataGrid… pero me encontré con un muy resbaladizas la mejora del rendimiento truco que espero que alguien más va a encontrar muy útiles.

    Asumiendo que usted está utilizando una ItemsPresenter dentro de un expansor de su GroupItem la plantilla por defecto y su expansor no se expande, a continuación, intente simplemente la unión de la visibilidad de su ItemsPresenter a la expansión de la propiedad IsEnabled con el defecto de BooleanToVisibilityConverter:

    <BooleanToVisibilityConverter x:Key="bool2vis" />
    
    
    <DataGrid.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                <Expander x:Name="exp">
                                    <ItemsPresenter Visibility="{Binding ElementName=exp, Path=IsExpanded, Converter={StaticResource bool2vis}}" />
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </DataGrid.GroupStyle>

    Si usted está corriendo en el problema por el que el DataGrid tarda mucho en cargar (porque esencialmente dibujo de cada registro en el datagrid aunque es en el colapso de un expansor)… a continuación, utilizando el código anterior hará que el datagrid para no dibujar sus registros hasta que se expanda un grupo, y luego, sólo extraer los registros para ese grupo en particular.

    El lado negativo es que esto sólo ayuda si su expansores se derrumbó por defecto, y aún las filas no obtener virtualizados (si usted tiene 100 elementos en un grupo más grande, pero sólo el 20 ajuste en la pantalla, todo 100 será dibujado en el momento en que se expandió el grupo).

    La ventaja es que usted haya esencialmente implementado carga diferida de su DataGrid registros, por lo que no está realizando el trabajo de dibujo hasta que realmente necesita para ver los artículos (que usted elija para expandir el grupo). Para mi producto, mi grupo de cabecera que ha botones incorporados en la realización de operaciones en todos los artículos dentro de su grupo, así más a menudo que el usuario nunca se expandió a un grupo, a menos que sea necesario realizar una operación en un elemento individual dentro de un grupo.

    *Una cosa a tener en cuenta si el uso de este truco es que usted probablemente debería establecer algunas explícita anchos o el ancho mínimo de su encabezados de columna (porque los elementos no están siendo atraídos cuando el DataGrid primera carga, por lo que los encabezados de columna no se ajuste automático de tamaño para que se ajuste el elemento más grande).

    Esperemos que la verdadera virtualización se implementa en un futuro service pack, pero si no, espero que esto ayude a alguien!

    Actualización

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

    • Si sólo pudiera upvote dos veces… fantástico mejora del rendimiento en un accidente cerebrovascular
    • esto funcionó impresionante! yo tenía un lugar en el que estaba recibiendo de memoria todo el tiempo, y esto funcionó como un encanto!
    • esto es bueno, pero estoy atascado con una situación en la que tengo todos los grupos ampliado y varias filas por el expansor. ¿Sabe usted de una forma de virtualizar el ItemsPresenter insite Expansor?
    • Por desgracia, no tengo una buena respuesta para usted hasta .NET 4.5 se libera, que tendrá un IsVirtualizingWhenGrouping de la propiedad en el VirtualizingPanel clase: msdn.microsoft.com/en-us/library/…
    • lol «IsGoingToWorkProperlyUnderAnEdgecondition» – gracias por la info! Estoy mirando ahora. Me hizo encontrar este ejemplo en donde se utilice una fila para pretender ser un grupo, que puede permitir la virtualización, mientras que agrupan. blog.smoura.com/…
    • El VirtualizingPanel.IsVirtualizingWhenGrouping hizo el truco! Gracias por la información actualizada acerca de ello!

  2. 2

    No hay ninguna característica integrada que le permite habilitar la interfaz de usuario de Virtualización cuando agrupación está habilitado en un ListView o DataGrid, Si lo piensas por un segundo que también tiene sentido. ¿Cómo es el DataGrid para agrupar los elementos que no existen. Para aplicar la agrupación, el control se necesita para cargar toda la colección que frustraría el propósito entero de la virtualización.
    Lo mejor que puede hacer probablemente es proporcionar algún tipo de virtualización en su viewmodel (el objeto que se unen en el próximo año) en que sólo se proporcionan los datos necesarios en la actualidad además de algún tipo de datos genéricos acerca de la cantidad de datos que existe y, a continuación, falsa la opinión de ti mismo.

    Con la agrupación podría ser algo como esto: Cuando la agrupación está habilitado inicialmente todos los grupos se derrumbó. Por lo que su viewmodel sólo tendrían que proporcionar un elemento de cada grupo que hay. Sólo para asegurarse de que la vista contiene todos los grupos existentes. Tan pronto como el usuario se expande a un grupo de la ViewModel sería dinámicamente de recarga de los elementos de ese grupo. Esta es una muy simple y es la forma básica de virtulization y no óptimo, pero puede ser un buen punto de partida. Es sólo para illistrate el enfoque.

    • No estoy de acuerdo que la agrupación intrínsecamente rompe interfaz de usuario Visualización. Si usted piensa acerca de ello, de lo que estás hablando es de Visualización de Datos, que no me importa. Hay un punto válido, se realiza alrededor de los grupos de verse obligados a estar a la misma altura de las filas que contienen. Para simplificar la altura de diseño de los cálculos.
    • OP está hablando acerca de la interfaz de usuario de la virtualización de datos de virtualización (que creo que no hay control WPF admite).
  3. 0

    Como usted ha dicho, permitiendo la Agrupación de deshabilitar la interfaz de usuario de la virtualización.

    No creo que te voy a encontrar una manera fácil de resolver este problema. Yo te recomiendo para comprobar uno de los WPF DataGrid como el XCeeed que podría tener esta característica integrada en su control.

    • Sé que el resto de las cuadrículas tienen estas características hasta cierto punto, pero prefiero utilizar el WPF CodePlex cuadrícula como va a ser la norma y de todas las otras redes son una mierda de diferentes maneras.

Dejar respuesta

Please enter your comment!
Please enter your name here