Generics 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 von der x:TypeArguments
-Direktive 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
-Anweisung wird nicht unterstützt.
Typargumente werden als Zeichenfolge angegeben und haben in der Regel ein Präfix, z sys:String
. B. und sys:Int32
. Präfixe sind erforderlich, da die typischen Typen generischer CLR-Einschränkungen aus Bibliotheken stammen, die nicht dem Standardnamespace Xamarin.Forms zugeordnet sind. Die integrierten XAML 2009-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 zu den integrierten XAML 2009-Typen finden Sie unter XAML 2009 Language Primitives.
Mehrere Typargumente können mithilfe eines Kommastrennzeichens angegeben werden. Wenn eine generische Einschränkung generische Typen verwendet, sollten außerdem die geschachtelten Einschränkungstypargumente in Klammern enthalten sein.
Hinweis
Die x:Type
Markuperweiterung stellt einen CLR-Typreferenz für einen generischen Typ bereit und verfügt über eine ähnliche Funktion wie der typeof
Operator in C#. Weitere Informationen finden Sie unter x:Type markup extension.
Argument "Einzelner primitiver Typ"
Ein einzelnes Primitive Type-Argument kann mithilfe der -Anweisung als präfixiertes Zeichenfolgenargument x:TypeArguments
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 System.Collections.Generic
wird als scg
XAML-Namespace definiert. Die CollectionView.ItemsSource
Eigenschaft wird auf eine List<T>
festgelegt, die mit einem string
Type-Argument instanziiert wird, wobei der integrierte XAML 2009-Typ x:String
verwendet wird. Die List<string>
Auflistung wird mit mehreren string
Elementen initialisiert.
Alternativ kann die Auflistung mit dem List<T>
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>
Argument "Einzelner Objekttyp"
Ein einzelnes Objekttypargument kann mithilfe der -Anweisung als präfixiertes Zeichenfolgenargument x:TypeArguments
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 GenericsDemo.Models
wird als models
XAML-Namespace definiert und System.Collections.Generic
als scg
XAML-Namespace definiert. Die CollectionView.ItemsSource
-Eigenschaft ist auf ein List<T>
festgelegt, das mit einem Monkey
Type-Argument instanziiert wird. Die List<Monkey>
Auflistung wird mit mehreren Monkey
Elementen initialisiert, und ein DataTemplate
, das die Darstellung jedes Monkey
Objekts definiert, wird als der ItemTemplate
CollectionView
festgelegt.
Argumente mit mehreren Typen
Mehrere Typargumente können mithilfe der -Anweisung als präfixierte Zeichenfolgenargumente angegeben werden, die x:TypeArguments
durch ein Komma getrennt werden. Wenn eine generische Einschränkung generische Typen verwendet, sind die geschachtelten Einschränkungstypargumente in Klammern enthalten:
<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 GenericsDemo.Models
wird als models
XAML-Namespace definiert und System.Collections.Generic
als scg
XAML-Namespace definiert. Die CollectionView.ItemsSource
-Eigenschaft ist auf eine List<T>
festgelegt, die mit einer KeyValuePair<TKey, TValue>
Einschränkung instanziiert wird, mit den Argumenten string
des inneren Einschränkungstyps und Monkey
. Die List<KeyValuePair<string,Monkey>>
Auflistung wird mit mehreren KeyValuePair
Elementen initialisiert, wobei der nicht standardmäßige KeyValuePair
Konstruktor verwendet wird, und ein DataTemplate
, das die Darstellung jedes Monkey
-Objekts definiert, wird als von ItemTemplate
CollectionView
festgelegt. Informationen zum Übergeben von Argumenten an einen nicht standardmäßigen Konstruktor finden Sie unter Übergeben von Konstruktorargumenten.