folgendes Problem versuche ich derzeit zu lösen:
Ich gruppiere Daten in einem DataGrid. Dazu verwende ich einen Expander. In meinem ViewModel ist ein enum, der drei Expander-Zustände deklariert:
- collapseAll
- expandAll
- collapseAllButSelected
collapseAll: alle GroupItems werden kollabiert, d.h. die Expander aller GroupItems sind collapsed
expandAll: alle GroupItems sind geöffnet, d.h. die Expander aller GroupItems sind expanded
collapseAllButSelected: alle GroupItems sind kollabiert, es sei denn, ein Item aus der Gruppe wurde ausgewählt.
Ich habe dazu im XAML code bereitgestellt, der immer dann, wenn man auf einen ColumnHeader des DAtaGrids klickt ein Command auslöst.
Das Command initiiert einen Zähler, der je nach Anzahl der Klicks den ExpanderState verändert:
Beim ersten Klick auf den ColumnHeader collapseAll, beim zweiten Klick expandAll, beim dritten Klick collapseAllButSelected.
Diese Funktionalität habe ich bereits bereitgestellt – das funktioniert also.
Was ich nun vorhabe ist folgendes:1. Wenn die Elemente im DataGrid gruppiert werden…
a) frage den ExpanderState ab
b) prüfe, welche Column angeklickt wurde (welcher Name hat der Header)
c) je nachdem welche Bedingung zutrifft wähle ein entsprechendes Expander-Header-Template
Das könnte dann also so aussehen:
Wenn der ExpanderState collapseAll ist (a) UND die Column mit dem Header „Fach“ (b) angeklickt wurde lade ExpanderHeader-Template x (c).
Wenn der ExpanderState collapseAll ist (a) UND die Column mit dem Header „Note“ angeklickt wrude lade ExpanderHeader-Template y (c).
Wenn der ExpanderState expandAll ist (a) UND die Column mit dem Header „Fach“ (b) angeklickt wurde lade ExpanderHeader-Template z (c).
Wenn der ExpanderState expandAll ist (a) UND die Column mit dem Header „Note“ angeklickt wrude lade ExpanderHeader-Template u (c). … usw. usf.
Natürlich wollte ich „einfach“ anfangen und erstmal einen Prüffall durchspielen.
In meinem xaml-code sieht das so aus:
<!-- DataTemplates for the EXPANDER HEADERs -->
<DataTemplate x:Key="ExpanderHeaderExpanded">
<StackPanel>
<TextBlock Text="{Binding Path=DataContext.Name, RelativeSource={RelativeSource AncestorType=Expander}}"
FontSize="16" FontWeight="Bold"/>
<TextBlock Text=""/>
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="ExpanderHeaderCollapsed">
<StackPanel>
<TextBlock Text="{Binding Path=DataContext.Name, RelativeSource={RelativeSource AncestorType=Expander}}"
FontSize="16" FontWeight="Bold"/>
<TextBlock>
<TextBlock.Style>
<Style TargetType="TextBlock">
<Setter Property="Text">
<Setter.Value>
<MultiBinding Mode="OneWay" Converter="{StaticResource AverageValueConverter}" ConverterParameter="Subject">
<Binding Path="DataContext" RelativeSource="{RelativeSource FindAncestor, AncestorType=Expander, AncestorLevel=1}"/>
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType=DataGrid, AncestorLevel=1}"
Path="DataContext.AllGradesCV.View.Groups"></Binding>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</TextBlock.Style>
</TextBlock>
</StackPanel>
</DataTemplate>
<!-- Style for GroupItem Behaviour of EXPANDER -->
<Style x:Key="GroupItemStyle" TargetType="Expander">
<Setter Property="Background" Value="#FF5CB9EE"/>
<Setter Property="ExpandDirection" Value="Down"/>
<Style.Triggers>
<Trigger Property="IsExpanded" Value="True">
<Setter Property="HeaderTemplate" Value="{StaticResource ExpanderHeaderExpanded}"/>
</Trigger>
<!-- Diesen Trigger gegen MultiDataTrigger ersetzen?= -->
<!--<Trigger Property="IsExpanded" Value="False">
<Setter Property="HeaderTemplate" Value="{StaticResource ExpanderHeaderCollapsed}"/>
</Trigger>-->
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Property="IsExpanded" Value="False"/>
<Condition Binding="{Binding TargetNullValue=true, RelativeSource={RelativeSource AncestorType={x:Type DataGridTemplateColumn}}, Path=Header}" Value="Fach"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="HeaderTemplate" Value="{StaticResource ExpanderHeaderCollapsedType}"/>
</MultiDataTrigger.Setters>
</MultiDataTrigger>
Der Part mit dem MultiDataTrigger ist das Problem: wenn ich die App starte wird folgende Exception ausgegeben:
Fehler |
System.Windows.Markup.XamlParseException: "Nicht-NULL-Wert für "Binding" erforderlich." Innere Ausnahme: InvalidOperationException: Nicht-Null-Wert für “Binding” erforderlich. |
Ich vermute es fehlt ein Nicht-Null-Wert – was auch immer das bedeuten mag.
Ich bin mir nicht mal sicher, ob ich mit dem MultiDataTriffer für mein Vorhaben da auf dem richtigen Weg bin.
Daher hier noch kurz der Versuch einer Konkretisierung:
- ich möchte im Style mit dem Target-Type “Expander” auf die Property “IsExpanded” des Expanders binden (prüfen, ob der Value false ist”
- gleichzeitig auf das Property des DataGrids binden (Column --> Header--> Bezeichnung) und wenn letzterer den Value “Fach aufweist” im Setter das Property “HeaderTemplate” des Expanders setzen.
Gruß
Vorph