Genéricos em Xamarin.Forms XAML

Xamarin.Forms O XAML fornece suporte para o consumo de tipos CLR genéricos especificando as restrições genéricas como argumentos de tipo. Esse suporte é fornecido pela x:TypeArguments diretiva, que passa os argumentos de tipo restritivo de um genérico para o construtor do tipo genérico.

Importante

Não há suporte para a definição de classes genéricas em Xamarin.Forms XAML, com a x:TypeArguments diretiva.

Os argumentos de tipo são especificados como uma cadeia de caracteres e normalmente são prefixados, como sys:String e sys:Int32. A prefixação é necessária porque os tipos típicos de restrições genéricas do CLR vêm de bibliotecas que não são mapeadas para o namespace padrão Xamarin.Forms . No entanto, os tipos internos do XAML 2009, como x:String e x:Int32, também podem ser especificados como argumentos de tipo, onde x é o namespace da linguagem XAML para XAML 2009. Para obter mais informações sobre os tipos internos do XAML 2009, consulte Primitivos de linguagem XAML 2009.

Vários argumentos de tipo podem ser especificados usando um delimitador de vírgula. Além disso, se uma restrição genérica usar tipos genéricos, os argumentos do tipo de restrição aninhada deverão estar contidos entre parênteses.

Observação

A x:Type extensão de marcação fornece uma referência de tipo CLR para um tipo genérico e tem uma função semelhante ao typeof operador em C#. Para obter mais informações, consulte x:Type markup extension.

Argumento de tipo primitivo único

Um único argumento de tipo primitivo pode ser especificado como um argumento de cadeia de caracteres prefixada usando a x:TypeArguments diretiva:

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

Neste exemplo, System.Collections.Generic é definido como o scg namespace XAML. A CollectionView.ItemsSource propriedade é definida como um List<T> que é instanciado com um string argumento de tipo, usando o tipo interno x:String XAML 2009. A List<string> coleção é inicializada com vários string itens.

Como alternativa, mas de forma equivalente, a List<T> coleção pode ser instanciada com o 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>

Argumento de tipo de objeto único

Um único argumento de tipo de objeto pode ser especificado como um argumento de cadeia de caracteres prefixada usando a x:TypeArguments diretiva:

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

Neste exemplo, GenericsDemo.Models é definido como o models namespace XAML e System.Collections.Generic é definido como o scg namespace XAML. A CollectionView.ItemsSource propriedade é definida como um List<T> que é instanciado com um Monkey argumento de tipo. A List<Monkey> coleção é inicializada com vários Monkey itens, e um DataTemplate que define a aparência de cada Monkey objeto é definido como o ItemTemplate do CollectionView.

Vários argumentos de tipo

Vários argumentos de tipo podem ser especificados como argumentos de cadeia de caracteres prefixados, delimitados por uma vírgula, usando a x:TypeArguments diretiva. Quando uma restrição genérica usa tipos genéricos, os argumentos do tipo de restrição aninhada estão contidos entre parênteses:

<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    

Neste exemplo, GenericsDemo.Models é definido como o models namespace XAML e System.Collections.Generic é definido como o scg namespace XAML. A CollectionView.ItemsSource propriedade é definida como um List<T> que é instanciado com uma KeyValuePair<TKey, TValue> restrição, com os argumentos string do tipo de restrição interna e Monkey. A List<KeyValuePair<string,Monkey>> coleção é inicializada com vários KeyValuePair itens, usando o construtor não padrão KeyValuePair , e um DataTemplate que define a aparência de cada Monkey objeto é definido como o ItemTemplate do CollectionView. Para obter informações sobre como passar argumentos para um construtor não padrão, consulte Passando argumentos do construtor.