Condividi tramite


Generics in Xamarin.Forms XAML

Xamarin.Forms XAML fornisce supporto per l'utilizzo di tipi CLR generici specificando i vincoli generici come argomenti di tipo. Questo supporto viene fornito dalla x:TypeArguments direttiva , che passa gli argomenti di tipo con vincoli di un generico al costruttore del tipo generico.

Importante

La definizione di classi generiche in Xamarin.Forms XAML, con la x:TypeArguments direttiva , non è supportata.

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

È 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 x:Type di markup fornisce un riferimento al tipo CLR per un tipo generico e ha una funzione simile all'operatore typeof in C#. Per altre informazioni, vedere 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 x:TypeArguments direttiva :

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

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

In alternativa, ma in modo equivalente, è possibile creare un'istanza della List<T> raccolta con il tipo 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>

Argomento tipo di oggetto singolo

Un singolo argomento del tipo di oggetto può essere specificato come argomento stringa con prefisso usando la x:TypeArguments direttiva :

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

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

Più argomenti di tipo

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

<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    

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