Genéricos
XAML de la interfaz de usuario de aplicaciones multiplataforma de .NET (.NET MAUI) proporciona compatibilidad para consumir tipos CLR genéricos especificando las restricciones genéricas como argumentos de tipo. Esta compatibilidad se proporciona mediante la x:TypeArguments directiva , que pasa los argumentos de tipo restringido de un genérico al constructor del tipo genérico.
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 a los espacios de nombres MAUI de .NET predeterminados. 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 de lenguaje XAML 2009.
Importante
No se admite la definición de clases genéricas en XAML de MAUI de .NET, con la x:TypeArguments directiva .
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 de tipo de restricción anidada deben estar incluidos entre paréntesis.
Nota:
La x:Type extensión de marcado proporciona una referencia de tipo de Common Language Runtime (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
Un único argumento de tipo primitivo se puede especificar como argumento de cadena con prefijo mediante la x:TypeArguments directiva :
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
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 un List<T> que se crea una instancia con un string argumento de tipo, mediante el tipo integrado x:String 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://schemas.microsoft.com/dotnet/2021/maui"
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://schemas.microsoft.com/dotnet/2021/maui"
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 un List<T> que se crea una instancia 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 de tipo de restricción anidada se incluyen entre paréntesis:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
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 un List<T> que se crea una instancia de con una KeyValuePair<TKey, TValue> restricción, con los argumentos string de tipo de restricción interna y Monkey. La List<KeyValuePair<string,Monkey>> colección se inicializa con varios KeyValuePair elementos, utilizando el constructor no predeterminado KeyValuePair y un DataTemplate 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 Paso de argumentos de constructor.