WPF Grouping Style

  • WPF

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

    WPF Grouping Style

    Ich habe ein Datagrid an ein ListCollectionView gebunden. Darüber habe ich meine Daten gruppiert.
    Das sieht aktuell so aus:


    Allerdings würde ich es gerne so umgestalten, dass es so aussieht:


    Ich würde also gerne im Header der Gruppe die Informationen der Childobjekte zusammenfassen (z.B Addieren oder den Durchschnitt berechnen)
    Weiß irgendjemand wie man das macht? Ich muss ja irgendwie über eine Datenbindung an die Informationen der Childobjekte kommen.

    XAML-Code

    XML-Quellcode

    1. <ControlTemplate TargetType="{x:Type GroupItem}" x:Key="withExpander">
    2. <Border BorderThickness="1" BorderBrush="Black">
    3. <Expander IsExpanded="True">
    4. <Expander.Header>
    5. <StackPanel Orientation="Horizontal">
    6. <TextBlock Text="{Binding Path=Asin}" />
    7. <TextBlock Text="{Binding Path=ItemCount}"/>
    8. <TextBlock Text=" Items"/>
    9. </StackPanel>
    10. </Expander.Header>
    11. <ItemsPresenter />
    12. </Expander>
    13. </Border>
    14. </ControlTemplate>
    15. <ControlTemplate TargetType="{x:Type GroupItem}" x:Key="withOutExpander">
    16. <ItemsPresenter />
    17. </ControlTemplate>
    18. <!-- ... -->
    19. <DockPanel Grid.Row="1">
    20. <DataGrid x:Name="dataGrid" ItemsSource="{Binding Items}" IsReadOnly="True">
    21. <DataGrid.GroupStyle>
    22. <GroupStyle>
    23. <GroupStyle.HeaderTemplate>
    24. <DataTemplate>
    25. <StackPanel>
    26. <TextBlock Text="{Binding Path=Asin}" />
    27. </StackPanel>
    28. </DataTemplate>
    29. </GroupStyle.HeaderTemplate>
    30. <GroupStyle.ContainerStyle>
    31. <Style TargetType="{x:Type GroupItem}">
    32. <Setter Property="Template" Value="{StaticResource withExpander}" />
    33. <Style.Triggers>
    34. <DataTrigger Binding="{Binding Converter={StaticResource groupSizeToExpanderConverter}}" Value="False">
    35. <Setter Property="Template" Value="{StaticResource withOutExpander}"/>
    36. </DataTrigger>
    37. </Style.Triggers>
    38. </Style>
    39. </GroupStyle.ContainerStyle>
    40. </GroupStyle>
    41. </DataGrid.GroupStyle>
    42. </DataGrid>
    43. </DockPanel>


    (Ich habe zwei Controltemplates, weil ich keinen Expander haben möchte, wenn in der Gruppe nur ein Element ist)
    Über die Items-Eigenschaft kommst du ja an alle Items heran, die unter dem Header sind. Bau dir doch einen Converter, der als value die Liste nimmt und als parameter übergibst du einen Namen einer Eigenschaft. Der Converter liest nun alle Werte hinter diesen Eigenschaften aus und gibt die Summe zurück.

    Das erste Item bekommst du in XAML durch Items[Index] (also genauso wie in C#). Wenn du also das Datum des ersten Objektes haben willst, kannst du daran mit {Binding Items[0].Date} binden.
    Mfg
    Vincent