Genéricos en Xamarin.Forms XAML

Descargar ejemploDescargar el ejemplo

Xamarin.Forms XAML proporciona compatibilidad para consumir tipos CLR genéricos especificando las restricciones genéricas como argumentos de tipo. Esta compatibilidad la proporciona la x:TypeArguments directiva , que pasa los argumentos de tipo restringido de un genérico al constructor del tipo genérico.

Importante

No se admite la definición de clases genéricas en Xamarin.Forms XAML, con la x:TypeArguments directiva .

Los argumentos de tipo se especifican como una cadena y normalmente tienen el prefijo , como sys:String y sys:Int32. El prefijo es necesario porque los tipos típicos de restricciones genéricas CLR proceden de bibliotecas que no están asignadas al espacio de nombres predeterminado Xamarin.Forms . Sin embargo, los tipos integrados XAML 2009 como x:String y x:Int32, también se pueden especificar como argumentos de tipo, donde x es el espacio de nombres del lenguaje XAML para XAML 2009. Para obtener más información sobre los tipos integrados de XAML 2009, consulta Primitivos del lenguaje XAML 2009.

Se pueden especificar varios argumentos de tipo mediante un delimitador de comas. Además, si una restricción genérica usa tipos genéricos, los argumentos del tipo de restricción anidado deben estar incluidos entre paréntesis.

Nota

La x:Type extensión de marcado proporciona una referencia de tipo CLR para un tipo genérico y tiene una función similar al typeof operador en C#. Para obtener más información, vea extensión de marcado x:Type.

Argumento de tipo primitivo único

Se puede especificar un único argumento de tipo primitivo como argumento de cadena con prefijo mediante la x:TypeArguments directiva :

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

En este ejemplo, System.Collections.Generic se define como el scg espacio de nombres XAML. La CollectionView.ItemsSource propiedad se establece en x:String una List<T> instancia de con un string argumento de tipo, mediante el tipo integrado XAML 2009. La List<string> colección se inicializa con varios string elementos.

Como alternativa, pero equivalentemente, se puede crear una instancia de la List<T> colección con el 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

Un único argumento de tipo de objeto se puede especificar como un argumento de cadena con prefijo mediante la x:TypeArguments directiva :

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

En este ejemplo, GenericsDemo.Models se define como el models espacio de nombres XAML y System.Collections.Generic se define como espacio scg de nombres XAML. La CollectionView.ItemsSource propiedad se establece en una List<T> instancia de con un Monkey argumento de tipo. La List<Monkey> colección se inicializa con varios Monkey elementos y un DataTemplate objeto que define la apariencia de cada Monkey objeto se establece como el ItemTemplate de CollectionView.

Varios argumentos de tipo

Se pueden especificar varios argumentos de tipo como argumentos de cadena con prefijo, delimitados por una coma, mediante la x:TypeArguments directiva . Cuando una restricción genérica usa tipos genéricos, los argumentos del tipo de restricción anidado se incluyen entre paréntesis:

<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    

En este ejemplo, GenericsDemo.Models se define como el models espacio de nombres XAML y System.Collections.Generic se define como espacio scg de nombres XAML. La CollectionView.ItemsSource propiedad se establece en una List<T> instancia de con una KeyValuePair<TKey, TValue> restricción , con los argumentos string de tipo de restricción interno y Monkey. La List<KeyValuePair<string,Monkey>> colección se inicializa con varios KeyValuePair elementos, mediante el constructor no predeterminado KeyValuePair y un DataTemplate objeto que define la apariencia de cada Monkey objeto se establece como el ItemTemplate de CollectionView. Para obtener información sobre cómo pasar argumentos a un constructor no predeterminado, vea Pasar argumentos de constructor.