xaml
Modèles de données
Recherche…
Utilisation de DataTemplate dans un ListBox
Supposons que nous ayons l'extrait de code XAML suivant:
<ListBox x:Name="MyListBox" />
Ensuite, dans le code-behind de ce fichier XAML, nous écrivons ce qui suit dans le constructeur:
MyListBox.ItemsSource = new[]
{
1, 2, 3, 4, 5
};
En exécutant l'application, nous obtenons une liste de numéros que nous avons entrés.
Cependant, si nous essayons d'afficher une liste d'objets d'un type personnalisé, comme ceci
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" }
};
en supposant que nous avons une classe appelée Book
public class Book
{
public string Title { get; set; }
public string Author { get; set; }
}
alors la liste ressemblerait à ceci:
Bien que nous puissions supposer que ListBox sera suffisamment "intelligent" pour afficher nos objets de livre correctement, nous voyons en réalité le nom complet du type de Book . Ce que ListBox fait en réalité ici, c'est d'appeler la méthode ToString() intégrée sur les objets à afficher et, bien que cela produise le résultat souhaitable dans le cas des nombres, l'appel à ToString() sur des objets de classes personnalisées entraîne l'obtention du nom leur type, comme on le voit sur la capture d'écran.
Nous pourrions résoudre ce problème en écrivant ToString() pour notre classe de livre, c.-à-d.
public override string ToString()
{
return Title;
}
Cependant, ce n'est pas très flexible. Et si on veut aussi afficher l'auteur? Nous pourrions aussi écrire cela dans le ToString , mais que se passe-t-il si nous ne voulons pas cela dans toutes les listes de l'application? Que diriez-vous d'une belle couverture de livre à afficher?
C'est là que DataTemplates peut vous aider. Ce sont des extraits de XAML qui peuvent être "instanciés" si nécessaire, avec des détails correspondant aux données source pour lesquelles ils ont été créés. Autrement dit, si nous étendons notre code ListBox comme suit:
<ListBox x:Name="MyListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Title}" />
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
La liste créera alors un TextBox pour chaque élément de sa source, et les propriétés Text ces TextBox seront "remplies" avec les valeurs de la propriété Title de nos objets.
Si nous exécutons l'application maintenant, nous obtenons le même résultat que ci-dessus, * même si nous ToString implémentation personnalisée de ToString . Ce qui est avantageux à ce sujet, c'est que nous pouvons ensuite personnaliser ce modèle bien au-delà des capacités d'une simple string (et de ToString ). Nous pouvons utiliser n'importe quel élément XAML souhaité, y compris les éléments personnalisés, et pouvons "lier" leurs valeurs aux données réelles de nos objets (comme Title dans l'exemple ci-dessus). Par exemple, étendez le modèle comme suit:
<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>
Ensuite, nous obtenons une belle vue formatée de nos livres!



