Grouping im CollectionView, Summieren

  • WPF MVVM
  • .NET 7–8

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

    Grouping im CollectionView, Summieren

    Hallo,

    wenn ich GroupDescriptions erstelle, dann erzeugt er mir im CollectionView Elemente unter CollectionView.Groups
    Diese Elemente haben Eigenschaften wie Name, und ItemCount auf die man binden kann.
    Ich möchte auch gern die Summe einer Spalte haben, sowas ist ja eigentlich Standard beim Gruppieren, aber diese MS.Internal.Data.CollectionViewGroupInternal haben sowas ja nicht, man kommt auch nur ganz umständlich an die Elemente dran um selbst nachzurechnen.

    Wie wäre das ordentlich zu binden?

    Viele Grüße

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

    So läuft das jetzt erstmal. Man müsste vielleicht noch ein wenig tüfteln, wenn man das für verschiedene Eigenschaften gangbar machen will, ohne für jede neue Funktionen zu coden.

    XML-Quellcode

    1. <TextBlock Text="{Binding Items, ConverterParameter=Menge, Converter={StaticResource ProduktCollectionToResultConverter}}"/>


    VB.NET-Quellcode

    1. Public Class ProduktCollectionToResultConverter
    2. Implements IValueConverter
    3. Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
    4. Dim GroupItems = DirectCast(value, ReadOnlyObservableCollection(Of Object))
    5. Select Case parameter.ToString
    6. Case "Menge"
    7. If TypeOf GroupItems(0) Is Produkt Then
    8. Return MengeSum(GroupItems)
    9. Else
    10. Dim sum As Long
    11. For Each item In GroupItems
    12. sum += DiveDownSum(item)
    13. Next
    14. Return sum
    15. End If
    16. Case Else
    17. Return "Not defined"
    18. End Select
    19. End Function
    20. Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
    21. Throw New NotImplementedException()
    22. End Function
    23. Private Function DiveDownSum(group As Object) As Long
    24. Dim g = DirectCast(group, CollectionViewGroup)
    25. If g.IsBottomLevel Then Return MengeSum(g.Items)
    26. Dim sum As Long
    27. For Each item In g.Items
    28. sum += DiveDownSum(item)
    29. Next
    30. Return sum
    31. End Function
    32. Private Function MengeSum(items As ReadOnlyCollection(Of Object)) As Long
    33. Return items.Cast(Of Produkt).Sum(Function(s) s.Menge)
    34. End Function
    35. End Class


    Ich stelle fest, dass mit WPF Einiges mehr an Arbeitsspeicher veranschlagt wird. Und das nur aufgrund der Anzeige: Wenn ich eine Gruppe expande, dann geht der Arbeitsspeicher je nach Menge der enthaltenen Items nach oben. Die Elemente selbst sind schon vorher in der Collection geladen, sonst könnte er die Summe ja nicht berechnen.
    Ja ich schätz mit nem TreeView wird das wieder ein großer Aufwand das Design entsprechend anzupassen.
    Ich habe mich am Anfang auf das DataGrid einfach festgelegt und daher noch gar keine Ahnung vom TreeView.
    An sich find ich das DataGrid ganz ok. Ich erstelle darin Gruppen, das ist an sich auch super simpel, es gibt bei mir jetzt nur eine ToplevelGroup und eine LowlevelGroup, aber es schien mir, dass ich eventuell noch feiner gruppieren wollte. Gruppierung von Daten macht sie ja automatisch "baumartig"

    Und gerade "ungeeignet" finde ich das DataGrid auch nicht, die Basisdaten sind tabellarisch. Die TopLevelGroup kann zusammengeklappt werden und im Header jeder Gruppe wird mehr oder minder eine Summe einer oder zweier Spalten ausgewiesen.
    Es sei denn, du denkst, dass der Treeview mit der Anzeige-Performance anders umgehen könnte.