Daten in Listen filtern mit ListCollectionView

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Daten aus einer SQL Server-Datenbank oder anderen Datenquellen können wir über das Entity Frame-work als Objekte zugänglich machen und auch als solche in Listen-Steuerelementen anzeigen. Aber wie sieht es mit weiteren Funktionen aus – etwa zum Filtern, Sortieren oder Gruppieren Dazu benötigen wir einige spezielle Techniken, von denen wir die zum Filtern von Daten nach bestimmten Kriterien im vorliegenden Artikel vorstellen. Dabei nutzen wir Filter für Felder mit verschiedenen Datentypen und in verschiedenen Kombinationen.

Beispieldaten

Als Beispielmaterial wollen wir diesmal nicht auf ein extra anzulegendes Entity Data Model zugreifen, sondern einfach eine Liste von Kunde-Elementen erstellen, die ihre Daten aus einer Funktion bezieht statt aus einer Datenbank. Damit wir ein wenig Spielmaterial haben, soll die Kunde-Klasse String-, Zahlen-, Datums- und Boolean-Werte enthalten. Die Klasse Kunde sieht daher wie folgt aus:

Partial Public Class Kunde
     Public Property ID As System.Int32
     Public Property Firma As System.String
     Public Property Vorname As System.String
     Public Property Nachname As System.String
     Public Property Anrede As System.String
     Public Property Strasse As System.String
     Public Property PLZ As System.String
     Public Property Ort As System.String
     Public Property Land As System.String
     Public Property EMail As System.String
     Public Property Geburtsdatum As System.DateTime
     Public Property Alter As System.Int32
     Public Property Newsletter As System.Boolean
End Class

Um ein ListView-Steuerelement zu füllen, benötigen wir Beispieldaten, die wir mit einer Funktion namens GetKunden bereitstellen. Diese fügen wir im Code behind-Modul des Fensters MainWindow ein:

Private Function GetKunden() As ObservableCollection(Of Kunde)
     Dim Kunden As New ObservableCollection(Of Kunde)
     Kunden.Add(New Kunde() With {.ID = 1, .Firma = "Krahn GbR", .Vorname = "Adi", _
        .Nachname = "Stratmann", .Anrede = "Herr", .Strasse = "Kremser Straße 54", .PLZ = "10589", _
        .Ort = "Berlin", .Land = "Deutschland", .EMail = "adi@stratmann.de", _
        .Geburtsdatum = "20.02.1939", .Alter = 82, .Newsletter = -1})
     Kunden.Add(New Kunde() With {.ID = 2, .Firma = "Göllner AG", .Vorname = "Heidi", _
         .Nachname = "Eich", .Anrede = "Frau", .Strasse = "Moosstraße 30", .PLZ = "42289", _
         .Ort = "Wuppertal", .Land = "Deutschland", .EMail = "heidi@eich.de", _
         .Geburtsdatum = "30.11.1971", .Alter = 50, .Newsletter = 0})
     Kunden.Add(New Kunde() With {.ID = 3, .Firma = "Peukert GmbH & Co. KG", .Vorname = "Wernfried", _
         .Nachname = "Birk", .Anrede = "Herr", .Strasse = "Wiener Straße 78", .PLZ = "22297", _
         .Ort = "Hamburg", .Land = "Deutschland", .EMail = "wernfried@birk.de", _
         .Geburtsdatum = "23.01.1931", .Alter = 90, .Newsletter = -1})
     ...
     Kunden.Add(New Kunde() With {.ID = 100, .Firma = "Krahn KG", .Vorname = "Rosemaria", _
         .Nachname = "Grill", .Anrede = "Frau", .Strasse = "Kalvarienbergstraße 35", .PLZ = "09131", _
         .Ort = "Chemnitz", .Land = "Deutschland", .EMail = "rosemaria@grill.de", _
         .Geburtsdatum = "02.10.2009", .Alter = 12, .Newsletter = -1})
     Return Kunden
End Function

In der Klasse MainWindow hinterlegen wir außerdem noch eine private Variable für die Auflistung der Kunden:

Private _Kunden As ObservableCollection(Of Kunde)

Diese machen wir über die folgende öffentlich deklarierte Property verfügbar:

Public Property Kunden As ObservableCollection(Of Kunde)
     Get
         Return _Kunden
     End Get
     Set(value As ObservableCollection(Of Kunde))
         _Kunden = value
     End Set
End Property

Schließlich sorgen wir in der Konstruktor-Methode der Klasse, die beim Anzeigen automatisch ausgeführt wird, dass die XAML-Definition umgesetzt, der DataContext auf die aktuelle Code behind-Klasse gesetzt und die Eigenschaft _Kunden mit dem Ergebnis der Funktion GetKunden gefüllt wird:

Public Sub New()
     InitializeComponent()
     DataContext = Me
     _Kunden = GetKunden()
End Sub

Fenster mit ListView-Steuerelement

Danach definieren wir den XAML-Code für das Fenster zur Anzeige der Daten im ListView-Steuerelement:

<Window x:Class="MainWindow" ...
         Title="MainWindow" Height="450" Width="800" WindowStartupLocation="CenterScreen">
     ...
     <Grid>
         ...
         <ListView x:Name="lvw" ItemsSource="{Binding Kunden}">
             <ListView.View>
                 <GridView>
                     <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" />
                     <GridViewColumn Header="Firma" DisplayMemberBinding="{Binding Firma}" />
                     <GridViewColumn Header="Vorname" DisplayMemberBinding="{Binding Vorname}" />
                     <GridViewColumn Header="Nachname" DisplayMemberBinding="{Binding Nachname}" />
                     <GridViewColumn Header="Anrede" DisplayMemberBinding="{Binding Anrede}" />
                     <GridViewColumn Header="Strasse" DisplayMemberBinding="{Binding Strasse}" />
                     <GridViewColumn Header="PLZ" DisplayMemberBinding="{Binding PLZ}" />
                     <GridViewColumn Header="Ort" DisplayMemberBinding="{Binding Ort}" />
                     <GridViewColumn Header="Land" DisplayMemberBinding="{Binding Land}" />
                     <GridViewColumn Header="EMail" DisplayMemberBinding="{Binding EMail}" />
                     <GridViewColumn Header="Geburtsdatum"                         DisplayMemberBinding="{Binding Path=Geburtsdatum, StringFormat=''dd.MM.yyyy''}" />
                     <GridViewColumn Header="Alter" DisplayMemberBinding="{Binding Alter}" />
                     <GridViewColumn Header="Newsletter">
                         <GridViewColumn.CellTemplate>
                             <DataTemplate>
                                 <CheckBox IsChecked="{Binding Newsletter}" />
                             </DataTemplate>
                         </GridViewColumn.CellTemplate>
                     </GridViewColumn>
                 </GridView>
             </ListView.View>
         </ListView>
         <StackPanel Orientation="Horizontal" Grid.Row="1">
             <Button>Button</Button>
         </StackPanel>
     </Grid>
</Window>

Das ListView-Steuerelement stellen wir mit dem Attribut ItemsSource so ein, dass es den Wert der Eigenschaft Kunden als Datenquelle verwendet. Diese wird in der Code behind-Klasse wie oben beschrieben definiert. Die einzelnen Spalten im ListView-Steuerelement definieren wir als GridViewColumn-Elemente. Dabei geben wir mit dem Attribut Header die Spaltenüberschrift an und mit DisplayMemberBinding das Feld, aus der die Spalte ihre Daten beziehen soll. Hier verwenden wir meist den Wert {Binding [Feldname]}, wobei [Feldname] durch den jeweiligen Feldnamen ersetzt wird. Bei zwei Feldern gibt es Abweichungen von dieser Vorgehensweise: Beim Feld Geburtsdatum verwenden wir den Ausdruck {Binding Path=Geburtsdatum, StringFormat=”dd.MM.yyyy”}, um den Inhalt des Feldes Geburtsdatum entsprechend zu formatieren. Und im Falle des Feldes Newsletter, das den Datentyp Boolean hat, wollen wir den Inhalt in einem Kontrollkästchen anzeigen. Dazu benötigen wir eine etwas andere Struktur, die ein CheckBox-Steuerelement enthält, dessen Attribut Checked an das Feld Newsletter gebunden ist. Anschließend sieht das Fenster nach dem Starten der Anwendung wie in Bild 1 aus.

Die Liste der Kunden im ListView-Steuerelement

Bild 1: Die Liste der Kunden im ListView-Steuerelement

Grundlagen zum Filtern, Sortieren und Gruppieren

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar