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