Partager via


Génériques

L’interface utilisateur de l’application multiplateforme .NET (.NET MAUI) XAML prend en charge la consommation 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 directive x:TypeArguments, qui transmet les arguments de type contraignants d’un générique au constructeur du type générique.

Les arguments de type sont spécifiés sous la forme d’une 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 aux espaces de noms .NET MAUI par défaut. 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 du langage XAML pour XAML 2009. Pour plus d’informations sur les types intégrés XAML 2009, consultez primitives de langage XAML 2009.

Important

La définition de types génériques en XAML .NET MAUI, avec la directive x:TypeArguments, n’est pas prise en charge.

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.

Note

L’extension de balisage x:Type fournit une référence de type CLR (Common Language Runtime) 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 .

Pour plus d’informations sur la spécification des types génériques en XAML .NET MAUI, avec les directives x:DataType et x:Type, consultez les liaisons de compilation qui spécifient un type générique et 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 directive x:TypeArguments :

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             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 de noms XAML scg. La propriété CollectionView.ItemsSource est définie sur un List<T> instancié avec un argument de type string, en utilisant le type intégré de XAML 2009 x:String. La collection List<string> est initialisée avec plusieurs éléments string.

Autrement, mais de manière équivalente, la collection List<T> peut être instanciée avec le type CLR String :

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             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 directive x:TypeArguments :

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             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 x:DataType="models:Monkey">
                <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 de noms XAML models, et System.Collections.Generic est défini comme espace de noms XAML scg. La propriété CollectionView.ItemsSource est définie sur un List<T> instancié avec un argument de type Monkey. La collection List<Monkey> est initialisée avec plusieurs éléments Monkey et une DataTemplate qui définit l’apparence de chaque objet Monkey est définie comme ItemTemplate du CollectionView.

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 directive x:TypeArguments. 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://schemas.microsoft.com/dotnet/2021/maui"
             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 x:DataType="scg:KeyValuePair(x:String,models:Monkey)">
                <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 de noms XAML models, et System.Collections.Generic est défini comme espace de noms XAML scg. La propriété CollectionView.ItemsSource est définie sur un List<T> instancié avec une contrainte de KeyValuePair<TKey, TValue>, avec les arguments de type de contrainte interne string et Monkey. La collection List<KeyValuePair<string,Monkey>> est initialisée avec plusieurs éléments KeyValuePair, à l’aide du constructeur KeyValuePair non par défaut, et un DataTemplate qui définit l’apparence de chaque objet Monkey est défini comme ItemTemplate du CollectionView. Pour plus d’informations sur le passage d’arguments à un constructeur non par défaut, consultez Passer des arguments au constructeur.