Performance mit WPF in DataGrid Groupstyle

  • WPF
  • .NET 7–8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Performance mit WPF in DataGrid Groupstyle

    Hallo,

    meine Anwendung veranschlagt viel mehr Arbeitsspeicher als ich für richtig halte. Ich habe dazu gelesen, dass das mit schlechtem Xaml-Code schnell mal passiert.
    Ich lade ca. 3000 Datensätze, wobei es sich bei einem Datensatz um eine Klasse mit 26 Properties handelt, davon werden nur 10 angezeigt in einem DataGrid
    Das braucht erstmal nur 69MB im Arbeitsspeicher

    Wenn ich jetzt das DataGrid gruppiere (GroupStyles definiere), dann steigt der Arbeitspeicherverbraucher sobald ich eine! Gruppe im DataGrid expande um gut 50 bis 200MB und das dauert auch ein paar Sekunden je nachdem wieviel Elemente die Gruppe beinhaltet (300 ca. 8 Sekunden).

    Ich habe den Code soweit runtergebrochen wie es ging, wenn ich diesen Code ins DataGrid einfüge, dann geht die Performance in den Keller wie beschrieben. Ansonsten ändere ich nichts.

    XML-Quellcode

    1. <Window.Resources>
    2. <SolidColorBrush x:Key="TopLevelGroup.Foreground" Color="#FFFFFFFF"/>
    3. <SolidColorBrush x:Key="TopLevelGroup.Background" Color="#FFE00917"/>
    4. <SolidColorBrush x:Key="LowLevelGroup.Foreground" Color="#FF88000F"/>
    5. <SolidColorBrush x:Key="LowLevelGroup.Background" Color="#FFE6A586"/>
    6. <Style x:Key="TopLevelGroupStyle" TargetType="{x:Type GroupItem}">
    7. <Setter Property="Margin" Value="0,0,0,5"/>
    8. <Setter Property="Template">
    9. <Setter.Value>
    10. <ControlTemplate TargetType="{x:Type GroupItem}">
    11. <Expander IsExpanded="False" Background="{StaticResource TopLevelGroup.Background}" BorderBrush="#FF92020C" Foreground="#FF000000" BorderThickness="1,1,1,5">
    12. <Expander.Header>
    13. <DockPanel>
    14. </DockPanel>
    15. </Expander.Header>
    16. <ItemsPresenter />
    17. </Expander>
    18. </ControlTemplate>
    19. </Setter.Value>
    20. </Setter>
    21. </Style>
    22. </Window.Resources>
    23. <!--...im DataGrid-->
    24. <DataGrid.GroupStyle>
    25. <GroupStyle ContainerStyle="{StaticResource TopLevelGroupStyle}"/>
    26. <GroupStyle>
    27. <GroupStyle.HeaderTemplate>
    28. <DataTemplate>
    29. <Grid>
    30. </Grid>
    31. </DataTemplate>
    32. </GroupStyle.HeaderTemplate>
    33. </GroupStyle>
    34. </DataGrid.GroupStyle>
    35. <!--...im DataGrid-->


    Also die Daten und Gruppen sind alle schon vorhanden, der Code also definiert nur wie die Gruppen angezeigt werden sollen. Die TopLevelGroup kann auf- und zuklappen, die LowLevelGroup ist nur eine Art Gruppenbanner.
    Auch wenn ich eine Gruppierung rausnehme und eines der beiden Level entferne gibt es diesselben Probleme, das heißt sowohl im TopLevelGroupStyle als auch im LowlevelGroupStyle muss derselbe Fehler drin sein.

    In der untersten Ebene der Groups also im DockPanel und Grid habe ich auch noch was stehen, mit Bindings und unter anderem auch Berechnungen zu den Gruppenelementen, aber da liegt auch nicht das Problem, deshalb ist das leer.
    Und ja nun ist wirklich nur noch das Grundgerüst für die Gruppen übrig und da hört bei mir auch das Verständnis dann leider auf.
    Wisst ihr noch was?

    Viele Grüße

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    ErfinderDesRades schrieb:

    Ich finde Zeilen #26, 27 komisch - dass da mehrerer GroupStyles einer einzelnen Property zugeordnet sind.
    Wie findet Xaml den richtigen Style?
    Ich glaub das hab ich von Microsoft, so hieß es von n angegebenen GroupStyles sind n-1 den ersten n-1 GroupDescriptions zugeordnet und der letzte Style allen weiteren GroupDescriptions. Dieses Verhalten kann ich auch bestätigen.
    Davon abgesehen, es passiert auch mit nur einem GroupStyle, egal welchem von beiden

    Ich hatte ursprünglich mal gefragt wie ich Tabellen selbst in Klappcontainer unterteilen kann, da war ich noch in WinForms und wurde auf WPF verwiesen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Update:
    Der Arbeitsspeicherverbrauch besteht nur im Debug-Modus, das fertige Release macht das zum Glück nicht.

    <DataGrid VirtualizingPanel.IsVirtualizingWhenGrouping="True"/> lockert das Problem der Ladezeit teilweise auf.
    Beim Expanden dauert es nun gerade bei großen Gruppen deutlich weniger lange.
    Aber trotzdem ist jede Zeile langsamer als wenn das DataGrid ungruppiert bleibt. Das macht sich dann beim Scrollen bemerkbar, das ist nicht mehr so schön smooth, wenn man an der Scrollbar zieht.
    Auch unerklärlich wo der Unterschied zu ungruppiert ist, denn gerade wenn die Gruppe erstmal offen ist, ist es ja wirklich nur noch eine Liste

    Also so ist es auszuhalten, aber falls noch jemand eine Idee hat...