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.

inserisci la descrizione dell'immagine qui

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:

inserisci la descrizione dell'immagine qui

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;
}

inserisci la descrizione dell'immagine qui

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!

inserisci la descrizione dell'immagine qui



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow