Generics in Xamarin.Forms XAML
Xamarin.Forms XAML fornisce supporto per l'utilizzo di tipi CLR generici specificando i vincoli generici come argomenti di tipo. Questo supporto viene fornito dalla x:TypeArguments
direttiva , che passa gli argomenti di tipo con vincoli di un generico al costruttore del tipo generico.
Importante
La definizione di classi generiche in Xamarin.Forms XAML, con la x:TypeArguments
direttiva , non è supportata.
Gli argomenti di tipo vengono specificati come stringa e in genere sono preceduti sys:String
da e sys:Int32
. Il prefisso è obbligatorio perché i tipi tipici di vincoli generici CLR provengono da librerie non mappate allo spazio dei nomi predefinito Xamarin.Forms . Tuttavia, i tipi predefiniti XAML 2009, x:String
ad esempio e x:Int32
, possono anche essere specificati come argomenti di tipo, dove x
è lo spazio dei nomi del linguaggio XAML per XAML 2009. Per altre informazioni sui tipi predefiniti XAML 2009, vedi Primitive del linguaggio XAML 2009.
È possibile specificare più argomenti di tipo usando un delimitatore da virgole. Inoltre, se un vincolo generico usa tipi generici, gli argomenti del tipo di vincolo annidato devono essere contenuti tra parentesi.
Nota
L'estensione x:Type
di markup fornisce un riferimento al tipo CLR per un tipo generico e ha una funzione simile all'operatore typeof
in C#. Per altre informazioni, vedere estensione di markup x:Type.
Argomento di tipo primitivo singolo
Un singolo argomento di tipo primitivo può essere specificato come argomento stringa con prefisso usando la x:TypeArguments
direttiva :
<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>
In questo esempio viene System.Collections.Generic
definito come spazio dei scg
nomi XAML. La CollectionView.ItemsSource
proprietà viene impostata su un List<T>
oggetto di cui viene creata un'istanza con un string
argomento di tipo, usando il tipo predefinito x:String
XAML 2009. La List<string>
raccolta viene inizializzata con più string
elementi.
In alternativa, ma in modo equivalente, è possibile creare un'istanza della List<T>
raccolta con il 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>
Argomento tipo di oggetto singolo
Un singolo argomento del tipo di oggetto può essere specificato come argomento stringa con prefisso usando la x:TypeArguments
direttiva :
<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>
In questo esempio viene GenericsDemo.Models
definito come spazio models
dei nomi XAML ed System.Collections.Generic
è definito come spazio dei scg
nomi XAML. La CollectionView.ItemsSource
proprietà è impostata su un List<T>
oggetto di cui viene creata un'istanza con un Monkey
argomento di tipo. L'insieme List<Monkey>
viene inizializzato con più Monkey
elementi e un oggetto DataTemplate
che definisce l'aspetto di ogni Monkey
oggetto viene impostato come dell'oggetto ItemTemplate
CollectionView
.
Più argomenti di tipo
È possibile specificare più argomenti di tipo come argomenti stringa con prefisso, delimitati da una virgola, usando la x:TypeArguments
direttiva . Quando un vincolo generico usa tipi generici, gli argomenti del tipo di vincolo annidato sono contenuti tra parentesi:
<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
In questo esempio viene GenericsDemo.Models
definito come spazio models
dei nomi XAML ed System.Collections.Generic
è definito come spazio dei scg
nomi XAML. La CollectionView.ItemsSource
proprietà viene impostata su un List<T>
oggetto di cui viene creata un'istanza con un KeyValuePair<TKey, TValue>
vincolo, con gli string
argomenti del tipo di vincolo interno e Monkey
. L'insieme List<KeyValuePair<string,Monkey>>
viene inizializzato con più KeyValuePair
elementi, utilizzando il costruttore non predefinito KeyValuePair
e un oggetto DataTemplate
che definisce l'aspetto di ogni Monkey
oggetto viene impostato come ItemTemplate
dell'oggetto CollectionView
. Per informazioni sul passaggio di argomenti a un costruttore non predefinito, vedere Passaggio di argomenti del costruttore.