Generika in Xamarin.Forms XAML
Xamarin.Forms XAML bietet Unterstützung für die Verwendung generischer CLR-Typen, indem die generischen Einschränkungen als Typargumente angegeben werden. Diese Unterstützung wird über die Anweisung x:TypeArguments
bereitgestellt, die die einschränkenden Typargumente eines generischen Typs an den Konstruktor des generischen Typs übergibt.
Wichtig
Das Definieren generischer Klassen in Xamarin.Forms XAML mit der x:TypeArguments
Direktive wird nicht unterstützt.
Typargumente werden als Zeichenfolge angegeben und in der Regel mit einem Präfix versehen, z. B. sys:String
und sys:Int32
. Präfixierung ist erforderlich, da die typischen Typen generischer CLR-Einschränkungen aus Bibliotheken stammen, die nicht dem Standardnamespace Xamarin.Forms zugeordnet sind. Die in XAML 2009 integrierten Typen wie x:String
und x:Int32
können jedoch auch als Typargumente angegeben werden, wobei x
der XAML-Sprachnamespace für XAML 2009 ist. Weitere Informationen über die in XAML 2009 integrierten Typen finden Sie unter XAML 2009-Sprachprimitive.
Mehrere Typargumente können mit einem Trennzeichen (Komma) angegeben werden. Wenn eine generische Einschränkung generische Typen verwendet, sollten die geschachtelten Argumente für den Einschränkungstyp außerdem in Klammern gesetzt werden.
Hinweis
Die x:Type
Markuperweiterung stellt einen CLR-Typverweis für einen generischen Typ bereit und hat eine ähnliche Funktion wie der typeof
Operator in C#. Weitere Informationen finden Sie unter x:Type-Markuperweiterung.
Einzelnes Grundtypargument
Ein einzelnes Grundtypargument kann mit der Anweisung x:TypeArguments
als Zeichenfolgenargument mit einem Präfix angegeben werden:
<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 diesem Beispiel ist System.Collections.Generic
als der XAML-Namespace scg
definiert. Die Eigenschaft CollectionView.ItemsSource
wird auf List<T>
festgelegt und mit einem string
-Typargument instanziiert, wobei der in XAML 2009 integrierte Typ x:String
verwendet wird. Die Sammlung List<string>
wird mit mehreren string
-Elementen initialisiert.
Die Sammlung List<T>
kann alternativ, aber gleichwertig, mit dem CLR-Typ String
instanziiert werden:
<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>
Einzelnes Objekttypargument
Ein einzelnes Objekttypargument kann mit der Anweisung x:TypeArguments
als Zeichenfolgenargument mit Präfix angegeben werden:
<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 diesem Beispiel ist GenericsDemo.Models
als der XAML-Namespace models
und System.Collections.Generic
als der XAML-Namespace scg
definiert. Die Eigenschaft CollectionView.ItemsSource
wird auf List<T>
festgelegt und mit einem Monkey
-Typargument instanziiert. Die Sammlung List<Monkey>
wird mit mehreren Monkey
-Objekten initialisiert, und eine DataTemplate
, die das Aussehen jedes Monkey
-Objekts definiert, wird als ItemTemplate
von CollectionView
festgelegt.
Mehrere Typargumente
Mehrere Typargumente können als vorangestellte Zeichenfolgenargumente, die durch ein Komma getrennt sind, mit der Anweisung x:TypeArguments
angegeben werden. Wenn eine generische Einschränkung generische Typen verwendet, werden die geschachtelten Argumente für den Einschränkungstyp in Klammern gesetzt:
<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 diesem Beispiel ist GenericsDemo.Models
als der XAML-Namespace models
und System.Collections.Generic
als der XAML-Namespace scg
definiert. Die Eigenschaft CollectionView.ItemsSource
wird auf List<T>
gesetzt und mit einer Einschränkung KeyValuePair<TKey, TValue>
mit den inneren Argumenten des Einschränkungstyps string
und Monkey
instanziiert. Die Sammlung List<KeyValuePair<string,Monkey>>
wird mit mehreren KeyValuePair
-Elementen initialisiert, wobei der nicht standardmäßige KeyValuePair
-Konstruktor verwendet wird, und eine DataTemplate
, die das Aussehen jedes Monkey
-Objekts definiert, wird als ItemTemplate
von CollectionView
festgelegt. Informationen zum Übergeben von Argumenten an einen nicht standardmäßigen Konstruktor finden Sie unter Übergeben von Konstruktorargumenten.