Groupheader Expander Binding

  • WPF

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Groupheader Expander Binding

    Moin,
    ich habe ein Datagrid, welches ich nach einer Spalte gruppieren lasse.
    Die Gruppen haben einen Expander, sodass ich die Gruppierten Datensätze ausblenden kann.
    Nun möchte ich aber, dass die IsExpanded-Eigenschaft des Expanders an eine Eigenschaft aus der Datenquelle gebunden ist, bekomme aber immer den Fehler

    Quellcode

    1. Eine Ausnahme (erste Chance) des Typs "System.Windows.Markup.XamlParseException" ist in PresentationFramework.dll aufgetreten.
    2. Zusätzliche Informationen: Die Angabe eines Werts für "System.Windows.Data.Binding" führte zu einer Ausnahme.


    VB.NET-Quellcode

    1. <DataGrid x:Name="dg_Veranstaltungen" Style="{StaticResource dataGridTickerStyle}" ItemsSource="{Binding ticker}" CanUserAddRows="False" AutoGenerateColumns="False" SelectionMode="Single">
    2. <DataGrid.Columns>
    3. <DataGridTextColumn Header="Nachname" Binding="{Binding aNachname, Mode=OneWay}" />
    4. <DataGridTextColumn Header="Vorname" Binding="{Binding aVorname, Mode=OneWay}" />
    5. <DataGridCheckBoxColumn Header="Verfügbar" Binding="{Binding vfVerfügbar, Mode=OneWay}" />
    6. <DataGridCheckBoxColumn Header="N. Verfügbar" Binding="{Binding vfNichtVerfügbar, Mode=OneWay}" />
    7. </DataGrid.Columns>
    8. <DataGrid.GroupStyle>
    9. <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}" >
    10. <GroupStyle.Panel>
    11. <ItemsPanelTemplate>
    12. <DataGridRowsPresenter>
    13. </DataGridRowsPresenter>
    14. </ItemsPanelTemplate>
    15. </GroupStyle.Panel>
    16. </GroupStyle>
    17. </DataGrid.GroupStyle>
    18. </DataGrid>
    19. <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> //In Application.xaml
    20. <Setter Property="Template">
    21. <Setter.Value>
    22. <ControlTemplate TargetType="{x:Type GroupItem}">
    23. <Expander x:Name="exp" Background="White" Foreground="Black" IsTabStop="False" IsExpanded="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupItem}}, Converter={StaticResource ResourceKey=expandConverter}}">
    24. <Expander.Header>
    25. <TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupItem}}, Converter={StaticResource ResourceKey=groupTitleConverter}}" />
    26. </Expander.Header>
    27. <ItemsPresenter Focusable="False"/>
    28. </Expander>
    29. </ControlTemplate>
    30. </Setter.Value>
    31. </Setter>
    32. </Style>
    33. Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert
    34. Dim groupItem As GroupItem = CType(value, GroupItem)
    35. Dim collectionviewGroup As CollectionViewGroup = CType(groupItem.Content, CollectionViewGroup)
    36. Dim drTicker As dtTickerRow = CType(CType(collectionviewGroup.Items(0), DataRowView).Row, dtTickerRow)
    37. If drTicker.Expand Then
    38. Return Visibility.Visible
    39. Else
    40. Return Visibility.Hidden
    41. End If
    42. End Function


    Wo liegt mein Fehler ?( , denn mit dem GroupHeader funktioniert das Ganze ja.
    Gruß
    HamburgerJungeJr
    Für sowas gibt es DataTemplates, darin kannst du direkt an Eigenschaften der hinter den Items liegenden Daten binden. Nur ich seh gerade, MS hat das ziemlich verpfuscht, DataTemplates lassen sich nur auf die Items, nicht auf die GroupHeader anwenden.

    Allerdings geht es trotzdem einfacher. Der DataContext eine GroupItems ist ein CollectionViewGroup-Objekt, welches wiederum eine Items-Eigenschaft besitzt, in welcher die Items in der Gruppe aufgelistet sind:
    stackoverflow.com/questions/21…within-group-header-style
    Du solltest dir den kompletten Codebehind-Teil sparen und einfach sowas machen können:

    XML-Quellcode

    1. ​ <DataGrid x:Name="dg_Veranstaltungen" Style="{StaticResource dataGridTickerStyle}" ItemsSource="{Binding ticker}" CanUserAddRows="False" AutoGenerateColumns="False" SelectionMode="Single">
    2. <DataGrid.Columns>
    3. <DataGridTextColumn Header="Nachname" Binding="{Binding aNachname, Mode=OneWay}" />
    4. <DataGridTextColumn Header="Vorname" Binding="{Binding aVorname, Mode=OneWay}" />
    5. <DataGridCheckBoxColumn Header="Verfügbar" Binding="{Binding vfVerfügbar, Mode=OneWay}" />
    6. <DataGridCheckBoxColumn Header="N. Verfügbar" Binding="{Binding vfNichtVerfügbar, Mode=OneWay}" />
    7. </DataGrid.Columns>
    8. <DataGrid.GroupStyle>
    9. <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}" >
    10. <GroupStyle.Panel>
    11. <ItemsPanelTemplate>
    12. <DataGridRowsPresenter>
    13. </DataGridRowsPresenter>
    14. </ItemsPanelTemplate>
    15. </GroupStyle.Panel>
    16. </GroupStyle>
    17. </DataGrid.GroupStyle>
    18. </DataGrid>
    19. <VisibilityConverter
    20. <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> //In Application.xaml
    21. <Setter Property="Template">
    22. <Setter.Value>
    23. <ControlTemplate TargetType="{x:Type GroupItem}">
    24. <Expander x:Name="exp" Background="White" Foreground="Black" IsTabStop="False" IsExpanded="{Binding Items(0).Expand}">
    25. <Expander.Header>
    26. <TextBlock Text="{Binding Items(0).groupTitle}" />
    27. </Expander.Header>
    28. <ItemsPresenter Focusable="False"/>
    29. </Expander>
    30. </ControlTemplate>
    31. </Setter.Value>
    32. </Setter>
    33. </Style>
    Beim zweiten Binding hab ich jetzt mal den Namen der Eigenschaft geraten, musst du ggf. anpassen.