WPF-Datenbindung: Listen-Objekte

Wenn Sie WPF-Anwendungen erstellen wollen, wollen Sie die Daten der Anwendung in entsprechenden Fenstern darstellen. Ein Weg zu diesem Ziel ist das Bereitstellen der Daten in Listenform, also etwa als Collection oder Dictionary. Dieser Artikel zeigt, welche Schritte nötig sind, um eine Liste von Objekten auf Basis einer einfachen Klasse zu erstellen und seine Daten in geeigneten Listen-Steuerelementen eines WPF-Fensters anzuzeigen.

Im Beitrag WPF-Datenbindung: Einfache Objekte haben wir uns angesehen, wie Sie ein einfaches Objekt wie einen Kunden mit Eigenschaften wie Vorname, Nachname und Geburtsdatum in den Textfeldern eines WPF-Fensters anzeigen. Außerdem haben Sie dort erfahren, wie Sie die Daten in beiden Richtungen synchron halten können.

Nun wollen wir ein Listenobjekt wie beispielsweise eine Col-lection mit mehreren Kunde-Objekten füllen und diese samt ausgewählter Eigenschaften in verschiedenen Listen-Steuerelementen von WPF anzeigen – zum Beispiel im DataGrid, in der ComboBox, in der ListBox oder in der ListView. Welche Steuerelemente für die Darstellung einer Auflistung infrage kommen, hängt übrigens allein davon ab, ob diese von der Klasse ItemsControl abgeleitet sind. Was die Listen-Objekte angeht, deren Inhalt wir im Listen-Steuerelement abbilden wollen, so müssen diese lediglich die IEnumerable-Schnittstelle implementieren.

Ob ein Steuerelement die Klasse ItemsControl als Basistyp verwendet, können Sie beispielsweise im Objektkatalog nachlesen. Suchen Sie dort einfach nach dem gewünschten Steuerelement und schauen sich im linken Bereich die Basistypen des Steuerelements an. In Bild 1 finden Sie beispielsweise ItemsControl als Basistyp für das ComboBox-Steuerelement vor.

Prüfen, ob ein Steuerelement zur Darstellung von Listen geeignet ist

Bild 1: Prüfen, ob ein Steuerelement zur Darstellung von Listen geeignet ist

Der Objektkatalog hilft auch dabei, die als Datenquelle für ein Listen-Steuerelement infrage kommenden Klassen zu identifizieren. In Bild 2 etwa erkennen wir, dass das Collection-Objekt die Schnittstelle IEnumerable implementiert und somit als Datenquelle taugt.

Untersuchen einer Klasse auf Listen-Fähigkeit

Bild 2: Untersuchen einer Klasse auf Listen-Fähigkeit

Liste mit Kunden füllen

Schauen wir uns zunächst an, wie wir ein Listen-Objekt mit einigen verschiedenen Kunde-Objekten füllen. Da wir in diesem Fall wissen, dass wir immer den gleichen Objekttyp zum Listen-Objekt hinzufügen möchten, verwenden wir nicht die üblicherweise verwendeten Listen-Typen wie Collection oder ArrayList. Diese haben nämlich den Nachteil, dass sie beliebige Objekte aufnehmen können und dadurch beim Zugriff immer eine Typkonvertierung nötig ist.

Im Gegensatz dazu gibt es die typsicheren generischen Auflistungsklassen, bei denen man direkt bei der Deklaration angibt, welchen Typ die aufzunehmenden Elemente haben. Dieser wird dabei in spitzen Klammern hinter dem Schlüsselwort für die zu verwendende Auflistungsklasse angegeben. In unserem Beispiel wollen wir eine Methode namens GetKunden verwenden, um eine generische Auflistungsklasse des Typs List mit Elementen des Typs Kunde zu füllen und zurückzugeben.

Um die generische Klasse List zu verwenden, benötigen wir die Klasse System.Collections.Generic, die wir mit folgender Anweisung bereitstellen:

using System.Collections.Generic;

Die Methode GetKunden finden Sie in Listing 1. Nach dem Deklarieren und Initialisieren des List-Objekts kunden fügt die Methode mit der Add-Methode nacheinander drei neue Objekte des Typs Kunde hinzu. Die Definition der Klasse Kunde entnehmen Sie dem Beispielprojekt (siehe Kunde.cs), eine Beschreibung dieser Klasse liefert der Artikel WPF-Datenbindung: Einfache Objekte.

private List<Kunde> GetKunden() {
     List<Kunde> kunden = new List<Kunde>();
     kunden.Add(new Kunde { Vorname = "André", Nachname = "Minhorst", Geburtsdatum = new DateTime(1971, 1, 23) });
     kunden.Add(new Kunde { Vorname = "Klaus", Nachname = "Müller", Geburtsdatum = new DateTime(1981, 2, 3) });
     kunden.Add(new Kunde { Vorname = "Barbara", Nachname = "Schmitz", Geburtsdatum = new DateTime(1976, 3, 4) });
     return kunden;
}

Listing 1: Füllen einer generischen Liste mit Kunde-Objekten

Die Methode GetKunden testen wir mit einer kleinen Methode, die durch die Schaltfläche btnListenelementeAusgeben unseres Beispielfensters ListeBinden.xaml ausgelöst wird (Code siehe Listing 2). Die Methode durchläuft die Kunde-Objekte der mit GetKunden gelieferten generischen Liste in einer foreach-Schleife und stellt damit eine Zeichenkette zusammen, welche Vorname, Nachname und Geburtsdatum der Kunden enthält.

private void btnListenelementeAusgeben_Click(object sender, RoutedEventArgs e) {
     List<Kunde> kunden = GetKunden();
     string strKunden = "";
     foreach(Kunde kunde in kunden) {
         strKunden += "\n" + kunde.Vorname + " " + kunde.Nachname + " " + kunde.Geburtsdatum.ToShortDateString();
     }
     MessageBox.Show("Kunden:" + strKunden);
}

Listing 2: Testen der Methode GetKunden

Die Zeichenkette gibt die Methode dann per MessageBox auf der Benutzeroberfläche aus (siehe Bild 3).

Ausgabe der Daten einer Klasse

Bild 3: Ausgabe der Daten einer Klasse

Liste an ListBox binden

Wenn wir einmal eine Auflistung mit den gewünschten Objekten gefüllt haben, ist die Anzeige in einem Listen-Steuer-element nicht mehr besonders kompliziert. Wir wollen es zunächst mit einem ListBox-Steuerelement probieren.

Dazu fügen Sie zum Grid des Fensters wie in Listing 3 ein Label– und ein ListBox-Element hinzu.

<Grid>
     <Grid.ColumnDefinitions>
         <ColumnDefinition Width="60" />
         <ColumnDefinition Width="*" />
     </Grid.ColumnDefinitions>
     <Grid.RowDefinitions>
         <RowDefinition Height="30" />
         <RowDefinition Height="130" />
         <RowDefinition Height="30" />
     </Grid.RowDefinitions>
     <StackPanel Orientation="Horizontal" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2">
         <Button Content="Listenelemente ausgeben" Name="btnListenelementeAusgeben" Margin="5,5,5,5" 
             Click="btnListenelementeAusgeben_Click"/>
     </StackPanel>
     <Label Content="Kunden:" Grid.Row="1" Grid.Column="0" />
     <ListBox x:Name="lstKunden" Margin="5,5,5,5" VerticalAlignment="Top" Grid.Row="1" Grid.Column="1" />
</Grid>

Listing 3: Definition des Grids mit dem ListBox-Steuerelement

Für das ListBox-Steuerelement legen wir vorerst keine weiteren Eigenschaften fest. Das Füllen erledigen wir mit zwei Anweisungen, die beim Öffnen des Fensters ausgeführt werden und daher in der Konstruktor-Methode der Klasse ListeBinden.xaml.cs landen.

Die erste Anweisung stellt die Eigenschaft ItemsSource auf die Methode GetKunden ein, die zweite erklärt das Feld Nachname zu dem Feld, das im Listenfeld angezeigt werden soll:

public ListeBinden() {
     InitializeComponent();
     lstKunden.ItemsSource = GetKunden();
     lstKunden.DisplayMemberPath = "Nachname";
}

Das Ergebnis sieht schon einmal den Erwartungen entsprechend aus, wie Bild 4 zeigt.

Anzeigen von Kunden in einer ListBox

Bild 4: Anzeigen von Kunden in einer ListBox

Gewähltes Objekt anzeigen

Zunächst wollen wir uns ansehen, wie wir die Inhalte des aktuell gewählten Eintrags des ListBox-Steuerelements im Fenster anzeigen können. Dazu fügen wir zunächst drei Textfelder zu jeweils einer neuen Zeile im Grid hinzu.

Diese Textfelder binden wir gleich über einen speziellen Wert für das Attribut Text an ein Feld des aktuell in der ListBox ausgewählten Objekts, für das Textfeld txtVorname beispielsweise wie folgt:

<TextBox x:Name="txtVorname" 
     Text="{Binding Path=Vorname}" ... />

Das allein hilft allerdings noch nicht, da das aktuell ausgewählte Objekt im ListBox-Steuerelement noch als DataContext angegeben werden muss. Wenn Sie nur ein einziges Textfeld an das Objekt im ListBox-Steuerelement binden wollten, könnten Sie das Attribut DataContext gleich dem entsprechenden TextBox-Steuerelement hinzufügen:

<TextBox DataContext="{Binding ElementName=lstKunden,     Path=SelectedItem}" x:Name="txtVorname"     Text="{Binding Path=Vorname}" ... />

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins DATENBANKENTWICKLER:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 200 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar