Hintergrund abhngig von Wert formatieren im Silverlight Listview

Ein Anforderung könnte sein negative Werte in einer Tabelle rot darzustellen. Ich zeige wie man in einem Silverlight 2 Listview Control die Reihe (Zeile oder Row) den Hintergrund in der Farbe verändert. Gestuert wird das mit einer Checkbox in jeder Row.

image

Die Daten werden einfach generisch erzeugt und sind aber per Inotifypropertychanged Zwei Wege Bindungsfähig. Als Datenquelle dient eine Checkbox mit der die Daten zur Laufzeit geändert werden. Zur grafischen Anzeige wird ein Stackpanel verwendet dessen Hintergrund per Binding gebunden wird.

<ListBox x:Name="lstFields" SelectionChanged="lstFields_SelectionChanged" >
    <ListBox.ItemTemplate>
         <DataTemplate>
          <StackPanel Orientation="Horizontal" x:Name="stack1" 
               Background="{Binding checked,Converter={StaticResource srconverter}}">
               <CheckBox x:Name="chkFields" IsChecked="{Binding checked, Mode=TwoWay}"></CheckBox>
                <TextBlock Text="{Binding daten}"></TextBlock>
          </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Da die Checkbox nur true oder false enthalten kann und Farben von einem bestimmten Brush Typ sein müssen wird der Converter dazwischen geschalten.

Zunächst wird in der Page eine Referenz auf die Applikation erstellt und mit dem so erhaltenen Namesraum (hier c) eine statische Ressource erzeugt die auf die Klasse MyConverter zeigt. Der Key srconverter wird im obigen XAML referenziert.

...  xmlns:c="clr-namespace:SilverlightApplication1test"
             >
<UserControl.Resources>
        <c:MyConverter x:Key="srconverter"></c:MyConverter>
</UserControl.Resources>

Nun fehlt nur noch der Converter der theoretisch umwandeln und rückumwandeln beherrscht. Aber da die Farbe nur eine einwege Datenbindung benötigt reicht folgender sehr einfacher Code.

Public Class MyConverter
    Implements IValueConverter
    Dim brush1 As SolidColorBrush = New SolidColorBrush(Color.FromArgb(255, 100, 200, 255))
   Dim brush2 As SolidColorBrush = New SolidColorBrush(Color.FromArgb(255, 200, 100, 155))

Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, 
ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object 
Implements System.Windows.Data.IValueConverter.Convert
        Return IIf(value, brush1, brush2)
End Function

Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, 
ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As 
Object Implements System.Windows.Data.IValueConverter.ConvertBack
        Throw New NotImplementedException()
End Function

End Class

Das Interface IValueConverter stellt sicher das beide Methoden implementiert sein müssen.

Kommentar schreiben