Genéricos en Xamarin.Forms XAML
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 directiva , que pasa los argumentos de tipo de restricción de un genérico al x:TypeArguments constructor del tipo genérico.
Importante
No se admite la definición de clases genéricas en Xamarin.Formsx:TypeArguments XAML, con la directiva .
Los argumentos de tipo se especifican como una cadena y suelen tener 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 Xamarin.Forms predeterminado. Sin embargo, los tipos integrados de XAML 2009, como y , también se pueden especificar como argumentos de tipo, donde es el espacio de nombres del lenguaje XAML para x:Stringx:Int32 XAML x 2009. Para obtener más información sobre los tipos integrados de XAML 2009, vea Xaml 2009 Language Primitives.
Se pueden especificar varios argumentos de tipo mediante un delimitador de coma. Además, si una restricción genérica usa tipos genéricos, los argumentos de tipo de restricción anidada deben incluirse entre paréntesis.
Nota:
La extensión de marcado proporciona una referencia de tipo CLR para un tipo genérico y tiene una función x:Type similar al operador en typeof C#. Para obtener más información, vea x:Type markup extension.
Argumento de tipo primitivo único
Un único argumento de tipo primitivo se puede especificar 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 espacio de nombres scg XAML. La propiedad se establece en un objeto del que se crea una instancia con un argumento de tipo, mediante el tipo integrado CollectionView.ItemsSourceList<T> xaml string 2009. x:String La List<string> colección se inicializa con varios string elementos.
Como alternativa, pero de forma equivalente, se puede crear una instancia de List<T> la colección con el tipo String CLR:
<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 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, se define como el espacio de nombres GenericsDemo.Models XAML y se define como el espacio de nombres modelsSystem.Collections.Genericscg XAML. La CollectionView.ItemsSource propiedad se establece en un objeto del que se crea una instancia con un argumento de List<T>Monkey tipo. La colección se inicializa con varios elementos y un que define la apariencia de cada objeto se List<Monkey> establece como el de MonkeyDataTemplateMonkeyItemTemplateCollectionView .
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 de tipo de restricción anidada 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, se define como el espacio de nombres GenericsDemo.Models XAML y se define como el espacio de nombres modelsSystem.Collections.Genericscg XAML. La propiedad se establece en un objeto del que se crea una instancia con una restricción , con CollectionView.ItemsSource los argumentos de tipo List<T> de restricción interna y KeyValuePair<TKey, TValue>stringMonkey . La colección se inicializa con varios elementos, utilizando el constructor no predeterminado, y un que define la apariencia de cada objeto se establece como el de List<KeyValuePair<string,Monkey>>KeyValuePairKeyValuePairDataTemplateMonkeyItemTemplateCollectionView . Para obtener información sobre cómo pasar argumentos a un constructor no predeterminado, vea Pasar argumentos de constructor.
Descarga del ejemplo