xaml
Datenvorlagen
Suche…
Verwenden von DataTemplate in einer ListBox
Angenommen, wir haben das folgende XAML-Snippet:
<ListBox x:Name="MyListBox" />
Dann schreiben wir im Code-Behind für diese XAML-Datei Folgendes in den Konstruktor:
MyListBox.ItemsSource = new[]
{
1, 2, 3, 4, 5
};
Beim Ausführen der Anwendung erhalten wir eine Liste mit den von uns eingegebenen Nummern.
Wenn wir jedoch versuchen, eine Liste von Objekten eines benutzerdefinierten Typs anzuzeigen, wie hier
MyListBox.ItemsSource = new[]
{
new Book { Title = "The Hitchhiker's Guide to the Galaxy", Author = "Douglas Adams" },
new Book { Title = "The Restaurant at the End of the Universe", Author = "Douglas Adams" },
new Book { Title = "Life, the Universe and Everything", Author = "Douglas Adams" },
new Book { Title = "So Long, and Thanks for All the Fish", Author = "Douglas Adams" },
new Book { Title = "Mostly Harmless", Author = "Douglas Adams" }
};
Vorausgesetzt, wir haben eine Klasse namens Book
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
dann würde die Liste ungefähr so aussehen:
Während wir die List - Box „klug genug“ annehmen könnte sein wird unser Buch angezeigt werden genau richtig Objekte, was wir tatsächlich sehen , ist der vollständige Name des Book Was ListBox hier tatsächlich ausführt, ist das Aufrufen der integrierten ToString() Methode für Objekte, die angezeigt werden sollen, und während dies bei Zahlen zu dem gewünschten Ergebnis führt, führt das Aufrufen von ToString() für Objekte von benutzerdefinierten Klassen zum Namen ihre Art, wie auf dem Screenshot zu sehen.
Wir könnten das lösen, indem wir ToString() für unsere ToString() schreiben, dh
public override string ToString()
{
return Title;
}
Das ist jedoch nicht sehr flexibel. Was ist, wenn wir auch den Autor anzeigen möchten? Wir könnten das auch in den ToString schreiben, aber was ist, wenn wir das nicht in allen Listen der App wollen? Wie wäre es mit einem schönen Buchcover?
Hier können DataTemplates helfen. Es handelt sich dabei um XAML-Ausschnitte, die bei Bedarf "instanziiert" werden können und mit Details gemäß den Quelldaten gefüllt werden, für die sie erstellt wurden. Einfach ausgedrückt, wenn wir unseren ListBox-Code wie folgt erweitern:
<ListBox x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
dann wird die Liste ein erstellen TextBox für jedes Element in der Quelle, und die Textfelder ihre haben Text „ausgefüllt“ mit Werten aus dem Title Eigentum unserer Objekte.
Wenn wir die Anwendung jetzt ausführen, erhalten wir dieselbe Ausgabe wie oben *, selbst wenn wir die benutzerdefinierte ToString Implementierung löschen. Der Vorteil dabei ist, dass wir diese Vorlage dann weit über die Möglichkeiten eines einfachen string (und ToString ) ToString . Wir können jedes XAML-Element verwenden, das wir möchten, einschließlich benutzerdefinierter Elemente, und können deren Werte mit den tatsächlichen Daten unserer Objekte "binden" (wie Title im obigen Beispiel). Erweitern Sie beispielsweise die Vorlage wie folgt:
<ListBox x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock FontStyle="Italic" Text="{Binding Author}" />
<TextBlock FontSize="18" Text="{Binding Title}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Dann bekommen wir eine schöne formatierte Ansicht unserer Bücher!



