xaml
Modelli di dati
Ricerca…
Utilizzo di DataTemplate in un ListBox
Supponiamo di avere il seguente snippet XAML:
<ListBox x:Name="MyListBox" />
Quindi nel code-behind per questo file XAML, scriviamo quanto segue nel costruttore:
MyListBox.ItemsSource = new[]
{
1, 2, 3, 4, 5
};
Eseguendo l'applicazione, otteniamo un elenco di numeri che abbiamo inserito.
Tuttavia, se proviamo a visualizzare un elenco di oggetti di un tipo personalizzato, come questo
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" }
};
supponendo che abbiamo una classe chiamata Book
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
quindi la lista sarebbe simile a questa:
Mentre potremmo pensare che il ListBox sia "abbastanza intelligente" da mostrare i nostri oggetti del libro, quello che vediamo è il nome completo del tipo di Book . Ciò che ListBox fa in questo caso chiama il metodo ToString() incorporato sugli oggetti che vuole visualizzare, e mentre ciò produce il risultato desiderato nel caso dei numeri, chiamare ToString() sugli oggetti delle classi personalizzate comporta ottenere il nome di il loro tipo, come si vede sullo screenshot.
Potremmo risolvere ciò scrivendo ToString() per la nostra classe di libri, es
public override string ToString()
{
return Title;
}
Tuttavia, non è molto flessibile. E se volessimo mostrare anche l'autore? Potremmo scrivere anche nel ToString , ma cosa succede se non lo vogliamo in tutte le liste nell'app? Che ne dici di una bella copertina da mostrare?
Ecco dove DataTemplates può aiutare. Si tratta di frammenti di XAML che possono essere "istanziati" secondo necessità, riempiti con dettagli in base ai dati di origine per cui sono stati creati. In poche parole, se estendiamo il nostro codice ListBox come segue:
<ListBox x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
quindi la lista creerà un TextBox per ogni oggetto nella sua origine, e quei TextBox avranno le loro proprietà di Text "riempite" con valori dalla proprietà Title dei nostri oggetti.
Se eseguiamo l'applicazione ora, otteniamo lo stesso risultato di cui sopra *, anche se cancelliamo l'implementazione ToString personalizzata. Ciò che è vantaggioso è che possiamo personalizzare questo modello ben oltre le capacità di una semplice string (e ToString ). Possiamo utilizzare qualsiasi elemento XAML che vogliamo, compresi quelli personalizzati, e possiamo "legare" i loro valori ai dati effettivi dai nostri oggetti (come Title nell'esempio sopra). Ad esempio, estendi il modello come segue:
<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>
Quindi otteniamo una bella vista formattata dei nostri libri!



