Génériques en Xamarin.Forms XAML
Xamarin.Forms XAML prend en charge l’utilisation de types CLR génériques en spécifiant les contraintes génériques en tant qu’arguments de type. Cette prise en charge est fournie par la x:TypeArguments
directive, qui transmet les arguments de type contraignants d’un générique au constructeur du type générique.
Important
La définition de classes génériques en Xamarin.Forms XAML, avec la x:TypeArguments
directive, n’est pas prise en charge.
Les arguments de type sont spécifiés sous forme de chaîne et sont généralement préfixés, tels que sys:String
et sys:Int32
. Le préfixe est requis, car les types classiques de contraintes génériques CLR proviennent de bibliothèques qui ne sont pas mappées à l’espace de noms par défaut Xamarin.Forms . Toutefois, les types intégrés XAML 2009 tels que x:String
et x:Int32
, peuvent également être spécifiés en tant qu’arguments de type, où x
est l’espace de noms de langage XAML pour XAML 2009. Pour plus d’informations sur les types intégrés XAML 2009, consultez les primitives du langage XAML 2009.
Plusieurs arguments de type peuvent être spécifiés à l’aide d’un délimiteur de virgules. En outre, si une contrainte générique utilise des types génériques, les arguments de type de contrainte imbriqués doivent être contenus entre parenthèses.
Remarque
L’extension x:Type
de balisage fournit une référence de type CLR pour un type générique et a une fonction similaire à l’opérateur typeof
en C#. Pour plus d’informations, consultez l’extension de balisage x :Type.
Argument de type primitif unique
Un seul argument de type primitif peut être spécifié en tant qu’argument de chaîne préfixé à l’aide de la x:TypeArguments
directive :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
...>
<CollectionView>
<CollectionView.ItemsSource>
<scg:List x:TypeArguments="x:String">
<x:String>Baboon</x:String>
<x:String>Capuchin Monkey</x:String>
<x:String>Blue Monkey</x:String>
<x:String>Squirrel Monkey</x:String>
<x:String>Golden Lion Tamarin</x:String>
<x:String>Howler Monkey</x:String>
<x:String>Japanese Macaque</x:String>
</scg:List>
</CollectionView.ItemsSource>
</CollectionView>
</ContentPage>
Dans cet exemple, System.Collections.Generic
est défini comme espace scg
de noms XAML. La CollectionView.ItemsSource
propriété est définie sur un List<T>
instancié avec un string
argument de type, à l’aide du type intégré x:String
XAML 2009. La List<string>
collection est initialisée avec plusieurs string
éléments.
Sinon, mais de façon équivalente, la List<T>
collection peut être instanciée avec le type CLR String
:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
xmlns:sys="clr-namespace:System;assembly=netstandard"
...>
<CollectionView>
<CollectionView.ItemsSource>
<scg:List x:TypeArguments="sys:String">
<sys:String>Baboon</sys:String>
<sys:String>Capuchin Monkey</sys:String>
<sys:String>Blue Monkey</sys:String>
<sys:String>Squirrel Monkey</sys:String>
<sys:String>Golden Lion Tamarin</sys:String>
<sys:String>Howler Monkey</sys:String>
<sys:String>Japanese Macaque</sys:String>
</scg:List>
</CollectionView.ItemsSource>
</CollectionView>
</ContentPage>
Argument de type objet unique
Un argument de type d’objet unique peut être spécifié en tant qu’argument de chaîne préfixé à l’aide de la x:TypeArguments
directive :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:models="clr-namespace:GenericsDemo.Models"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
...>
<CollectionView>
<CollectionView.ItemsSource>
<scg:List x:TypeArguments="models:Monkey">
<models:Monkey Name="Baboon"
Location="Africa and Asia"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg" />
<models:Monkey Name="Capuchin Monkey"
Location="Central and South America"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Capuchin_Costa_Rica.jpg/200px-Capuchin_Costa_Rica.jpg" />
<models:Monkey Name="Blue Monkey"
Location="Central and East Africa"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/BlueMonkey.jpg/220px-BlueMonkey.jpg" />
</scg:List>
</CollectionView.ItemsSource>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Grid.RowSpan="2"
Source="{Binding ImageUrl}"
Aspect="AspectFill"
HeightRequest="60"
WidthRequest="60" />
<Label Grid.Column="1"
Text="{Binding Name}"
FontAttributes="Bold" />
<Label Grid.Row="1"
Grid.Column="1"
Text="{Binding Location}"
FontAttributes="Italic"
VerticalOptions="End" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</ContentPage>
Dans cet exemple, GenericsDemo.Models
est défini comme espace models
de noms XAML et System.Collections.Generic
est défini comme espace scg
de noms XAML. La CollectionView.ItemsSource
propriété est définie sur un List<T>
instancié avec un Monkey
argument de type. La List<Monkey>
collection est initialisée avec plusieurs Monkey
éléments, et une DataTemplate
qui définit l’apparence de chaque Monkey
objet est définie en tant que CollectionView
ItemTemplate
.
Arguments de type multiples
Plusieurs arguments de type peuvent être spécifiés en tant qu’arguments de chaîne préfixés, délimités par une virgule, à l’aide de la x:TypeArguments
directive. Lorsqu’une contrainte générique utilise des types génériques, les arguments de type de contrainte imbriqué sont contenus entre parenthèses :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:models="clr-namespace:GenericsDemo.Models"
xmlns:scg="clr-namespace:System.Collections.Generic;assembly=netstandard"
...>
<CollectionView>
<CollectionView.ItemsSource>
<scg:List x:TypeArguments="scg:KeyValuePair(x:String,models:Monkey)">
<scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
<x:Arguments>
<x:String>Baboon</x:String>
<models:Monkey Location="Africa and Asia"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/f/fc/Papio_anubis_%28Serengeti%2C_2009%29.jpg/200px-Papio_anubis_%28Serengeti%2C_2009%29.jpg" />
</x:Arguments>
</scg:KeyValuePair>
<scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
<x:Arguments>
<x:String>Capuchin Monkey</x:String>
<models:Monkey Location="Central and South America"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/4/40/Capuchin_Costa_Rica.jpg/200px-Capuchin_Costa_Rica.jpg" />
</x:Arguments>
</scg:KeyValuePair>
<scg:KeyValuePair x:TypeArguments="x:String,models:Monkey">
<x:Arguments>
<x:String>Blue Monkey</x:String>
<models:Monkey Location="Central and East Africa"
ImageUrl="https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/BlueMonkey.jpg/220px-BlueMonkey.jpg" />
</x:Arguments>
</scg:KeyValuePair>
</scg:List>
</CollectionView.ItemsSource>
<CollectionView.ItemTemplate>
<DataTemplate>
<Grid Padding="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Grid.RowSpan="2"
Source="{Binding Value.ImageUrl}"
Aspect="AspectFill"
HeightRequest="60"
WidthRequest="60" />
<Label Grid.Column="1"
Text="{Binding Key}"
FontAttributes="Bold" />
<Label Grid.Row="1"
Grid.Column="1"
Text="{Binding Value.Location}"
FontAttributes="Italic"
VerticalOptions="End" />
</Grid>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
</ContentPage
Dans cet exemple, GenericsDemo.Models
est défini comme espace models
de noms XAML et System.Collections.Generic
est défini comme espace scg
de noms XAML. La CollectionView.ItemsSource
propriété est définie sur un List<T>
instancié avec une KeyValuePair<TKey, TValue>
contrainte, avec les arguments string
de type de contrainte interne et Monkey
. La List<KeyValuePair<string,Monkey>>
collection est initialisée avec plusieurs KeyValuePair
éléments, à l’aide du constructeur non par défaut KeyValuePair
, et un DataTemplate
qui définit l’apparence de chaque Monkey
objet est défini comme étant le ItemTemplate
CollectionView
. Pour plus d’informations sur le passage d’arguments à un constructeur non par défaut, consultez Passage d’arguments de constructeur.