by wmn
2. September 2009 23:36
Häufig will man Daten, die einem bestimmten Status entsprechen oder bestimmte Werte überschreiten in einer Liste besonders hervorheben. Dies kann man in WPF recht einfach machen. Hier kann man sogar dynamisch die komplette optische Darstellung eines Elementes zur Laufzeit über einen Trigger austauschen.
Untenstehend habe ich einmal ein einfaches Beispiel aus einer WPF-Maske rauskopiert:
- Verwendet wird ein ListView-Steuerlement (erweiterte Listbox)
- der Trigger bzw. das Template ist der Einfachheit halber im XAML-Code direkt enthalten – im produktiven Einsatz sollte man diese in eine Ressource extrahieren damit man auch mehrere Spalten einfach daran binden kann
- Das Listview-Control ist an eine Collection gebunden, die über ein LINQ-Statement selektiert wird. Der Trigger schaltet die Farben abhängig vom Feldinhalt des Feldes Emplstatus (character) um:
<ListView x:Name="lstPlanEmployees" IsSynchronizedWithCurrentItem="True" ToolTip="durch auswählen Personendaten anzeigen" SelectionChanged="lstPlanEmployees_SelectionChanged" FontSize="12"ItemContainerStyle="{DynamicResource ItemContStyle}" >
<ListView.View>
<GridView>
<GridViewColumn Width="60" >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="txtStatusCol" Text="{Binding Path=Emplstatus}" />
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Emplstatus}" Value="aktiv">
<Setter Property="Foreground" TargetName="txtStatusCol" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding Path=Emplstatus}" Value="inaktiv" >
<Setter Property="Foreground" TargetName="txtStatusCol" Value="Yellow" />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=Jobtext}" Header="Jobtext" Width="150" />
<GridViewColumn DisplayMemberBinding="{Binding Path=Name}" Width="180" Header="Name" />
</GridView>
</ListView.View>
</ListView>