Partager via


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

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.