Condividi tramite


Generici

XAML di .NET MAUI per app multipiattaforma fornisce supporto per utilizzare i tipi generici di CLR specificando i vincoli generici come argomenti di tipo. Questo supporto viene fornito dalla direttiva x:TypeArguments, che passa gli argomenti di tipo vincolanti di un generico al costruttore del tipo generico.

Gli argomenti di tipo vengono specificati come stringa e in genere sono preceduti da sys:String e sys:Int32. Il prefisso è obbligatorio perché i tipi tipici di vincoli generici CLR provengono da librerie non mappate agli spazi dei nomi MAUI .NET predefiniti. Tuttavia, i tipi predefiniti XAML 2009, ad esempio x:String e x:Int32, possono essere specificati anche come argomenti di tipo, dove x è lo spazio dei nomi del linguaggio XAML per XAML 2009. Per altre informazioni sui tipi predefiniti XAML 2009, vedere primitive del linguaggio XAML 2009.

Importante

La definizione di tipi generici in XAML .NET MAUI, con la direttiva x:TypeArguments, non è supportata.

È possibile specificare più argomenti di tipo usando un delimitatore da virgole. Inoltre, se un vincolo generico usa tipi generici, gli argomenti del tipo di vincolo annidato devono essere contenuti tra parentesi.

Nota

L'estensione di markup x:Type fornisce un riferimento al tipo CLR (Common Language Runtime) per un tipo generico e ha una funzione simile all'operatore typeof in C#. Per ulteriori informazioni, vedere l'estensione di markup x:Type .

Per informazioni sulla specifica di tipi generici in .NET MAUI XAML, con le direttive x:DataType e x:Type, vedere Compilare binding che specificano un tipo generico e estensione di markup x:Type.

Argomento di tipo primitivo singolo

Un singolo argomento di tipo primitivo può essere specificato come argomento stringa con prefisso usando la direttiva 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>

In questo esempio System.Collections.Generic viene definito come spazio dei nomi XAML scg. La proprietà CollectionView.ItemsSource è impostata su un List<T> istanziato con un argomento di tipo string, usando il tipo predefinito x:String di XAML 2009. La collezione List<string> viene inizializzata con più elementi string.

In alternativa, è possibile instanziare in modo equivalente la raccolta List<T> con il tipo 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>

Argomento di tipo oggetto singolo

Un singolo argomento del tipo di oggetto può essere specificato come argomento stringa con prefisso usando la direttiva 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>
                <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>

In questo esempio, GenericsDemo.Models viene definito come spazio dei nomi XAML models e System.Collections.Generic viene definito come spazio dei nomi XAML scg. La proprietà CollectionView.ItemsSource è impostata su un List<T> istanziato con un argomento di tipo Monkey. L'insieme List<Monkey> viene inizializzato con più elementi Monkey e un DataTemplate che definisce l'aspetto di ogni oggetto Monkey viene impostato come ItemTemplate del CollectionView.

Più argomenti di tipo

È possibile specificare più argomenti di tipo come argomenti stringa preceduti, delimitati da una virgola, usando la direttiva x:TypeArguments. Quando un vincolo generico usa tipi generici, gli argomenti del tipo di vincolo annidato sono contenuti tra parentesi:

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

In questo esempio, GenericsDemo.Models viene definito come spazio dei nomi XAML models e System.Collections.Generic viene definito come spazio dei nomi XAML scg. La proprietà CollectionView.ItemsSource è impostata su un List<T> che viene istanziato con un vincolo KeyValuePair<TKey, TValue>, e gli argomenti del tipo di vincolo interno sono string e Monkey. L'insieme List<KeyValuePair<string,Monkey>> viene inizializzato con diversi elementi KeyValuePair usando il costruttore KeyValuePair non predefinito, e un DataTemplate, che definisce l'aspetto di ogni oggetto Monkey, viene impostato come ItemTemplate del CollectionView. Per informazioni sul passaggio di argomenti a un costruttore non predefinito, vedere Passare gli argomenti del costruttore.