Szukaj…


Używanie DataTemplate w ListBox

Załóżmy, że mamy następujący fragment kodu XAML:

<ListBox x:Name="MyListBox" />

Następnie w kodzie tego pliku XAML piszemy w konstruktorze:

MyListBox.ItemsSource = new[]
{
    1, 2, 3, 4, 5
};

Po uruchomieniu aplikacji otrzymujemy listę liczb, które wpisaliśmy.

wprowadź opis zdjęcia tutaj

Jeśli jednak spróbujemy wyświetlić listę obiektów typu niestandardowego, to tak

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

zakładając, że mamy klasę o nazwie Book

public class Book
{
    public string Title { get; set; }
    public string Author { get; set; }
}

wtedy lista wyglądałaby mniej więcej tak:

wprowadź opis zdjęcia tutaj

Chociaż możemy założyć, że ListBox będzie „wystarczająco inteligentny”, aby wyświetlać nasze obiekty książek we właściwy sposób, to tak naprawdę widzimy pełną nazwę typu Book . To, co ListBox tutaj robi, to wywoływanie wbudowanej metody ToString() na obiektach, które chce wyświetlić, i chociaż daje to pożądany wynik w przypadku liczb, wywołanie ToString() na obiektach klas niestandardowych powoduje uzyskanie nazwy ich typ, jak widać na zrzucie ekranu.

Możemy to rozwiązać, pisząc ToString() dla naszej klasy książek, tj

public override string ToString()
{
    return Title;
}

wprowadź opis zdjęcia tutaj

Nie jest to jednak zbyt elastyczne. Co jeśli chcemy również wyświetlić autora? Możemy to również zapisać w ToString , ale co, jeśli nie chcemy tego na wszystkich listach w aplikacji? Co powiesz na ładną okładkę książki do wyświetlenia?

Właśnie tam DataTemplates może pomóc. Są to fragmenty kodu XAML, które można w razie potrzeby „utworzyć”, wypełniając szczegółami zgodnie z danymi źródłowymi, dla których zostały utworzone. Mówiąc najprościej, jeśli rozszerzymy nasz kod ListBox w następujący sposób:

<ListBox x:Name="MyListBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Title}" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

wówczas lista utworzy TextBox dla każdego elementu w jego źródle, a te TextBoxy będą miały „właściwości Text ” „wypełnione” wartościami z właściwości Title naszych obiektów.

Jeśli uruchomimy aplikację teraz, otrzymamy takie same dane wyjściowe jak powyżej *, nawet jeśli usuniemy niestandardową implementację ToString . Zaletą tego jest to, że możemy następnie dostosować ten szablon znacznie wykraczający poza możliwości prostego string (i ToString ). Możemy użyć dowolnego elementu XAML, w tym niestandardowego, i możemy „powiązać” ich wartości z rzeczywistymi danymi z naszych obiektów (np. Title w powyższym przykładzie). Na przykład rozszerz szablon w następujący sposób:

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

Następnie uzyskujemy ładny sformatowany widok naszych książek!

wprowadź opis zdjęcia tutaj



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow