Vytvoření objektu Xamarin.Forms DataTemplateSelector
A DataTemplateSelector lze použít k výběru DataTemplate za běhu na základě hodnoty vlastnosti vázané na data. To umožňuje použití více DataTemplates na stejný typ objektu, aby bylo možné přizpůsobit vzhled konkrétních objektů. Tento článek ukazuje, jak vytvořit a využívat DataTemplateSelector.
Selektor šablony dat umožňuje scénáře, jako ListView
je vazba na kolekci objektů, kde vzhled každého objektu ListView
v modulu runtime může vybrat selektor šablony dat vracející konkrétní DataTemplate
objekt .
Vytvoření objektu DataTemplateSelector
Selektor šablony dat je implementován vytvořením třídy, která dědí z DataTemplateSelector
. Metoda OnSelectTemplate
se pak přepíše tak, aby vrátila konkrétní DataTemplate
, jak je znázorněno v následujícím příkladu kódu:
public class PersonDataTemplateSelector : DataTemplateSelector
{
public DataTemplate ValidTemplate { get; set; }
public DataTemplate InvalidTemplate { get; set; }
protected override DataTemplate OnSelectTemplate (object item, BindableObject container)
{
return ((Person)item).DateOfBirth.Year >= 1980 ? ValidTemplate : InvalidTemplate;
}
}
Metoda OnSelectTemplate
vrátí příslušnou šablonu na základě hodnoty DateOfBirth
vlastnosti. Šablona, která se má vrátit, je hodnota ValidTemplate
vlastnosti nebo InvalidTemplate
vlastnosti, které jsou nastaveny při využívání PersonDataTemplateSelector
.
Instanci třídy selektoru šablony dat lze pak přiřadit k ovládacím Xamarin.Forms vlastnostem, jako ListView.ItemTemplate
je . Seznam platných vlastností naleznete v tématu Vytvoření objektu DataTemplate.
Omezení
DataTemplateSelector
instance mají následující omezení:
- Podtřída
DataTemplateSelector
musí vždy vrátit stejnou šablonu pro stejná data, pokud se dotazuje vícekrát. - Podtřída
DataTemplateSelector
nesmí vracet jinouDataTemplateSelector
podtřídu. - Podtřída
DataTemplateSelector
nesmí v každém volání vracet nové instanceDataTemplate
. Místo toho musí být vrácena stejná instance. Pokud to neuděláte, vytvoří se nevrácená paměť a virtualizace se zakáže. - V Androidu nesmí existovat více než 20 různých datových šablon na jeden
ListView
.
Využívání objektu DataTemplateSelector v XAML
V jazyce XAML je možné instanci PersonDataTemplateSelector
vytvořit deklarováním prostředku, jak je znázorněno v následujícím příkladu kódu:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:Selector;assembly=Selector" x:Class="Selector.HomePage">
<ContentPage.Resources>
<ResourceDictionary>
<DataTemplate x:Key="validPersonTemplate">
<ViewCell>
...
</ViewCell>
</DataTemplate>
<DataTemplate x:Key="invalidPersonTemplate">
<ViewCell>
...
</ViewCell>
</DataTemplate>
<local:PersonDataTemplateSelector x:Key="personDataTemplateSelector"
ValidTemplate="{StaticResource validPersonTemplate}"
InvalidTemplate="{StaticResource invalidPersonTemplate}" />
</ResourceDictionary>
</ContentPage.Resources>
...
</ContentPage>
Tato úroveň ResourceDictionary
stránky definuje dvě DataTemplate
instance a PersonDataTemplateSelector
instanci. Instance PersonDataTemplateSelector
nastaví své ValidTemplate
a InvalidTemplate
vlastnosti na příslušné DataTemplate
instance pomocí StaticResource
rozšíření značek. Všimněte si, že i když jsou prostředky definované na stránce ResourceDictionary
, mohou být také definovány na úrovni řízení nebo na úrovni aplikace.
Instance PersonDataTemplateSelector
je spotřebována přiřazením k ListView.ItemTemplate
vlastnosti, jak je znázorněno v následujícím příkladu kódu:
<ListView x:Name="listView" ItemTemplate="{StaticResource personDataTemplateSelector}" />
Za běhu ListView
volá metodu PersonDataTemplateSelector.OnSelectTemplate
pro každou z položek v podkladové kolekci, přičemž volání předává datový objekt jako item
parametr. To DataTemplate
, které je vráceno metodou, se pak použije na tento objekt.
Následující snímky obrazovky ukazují výsledek ListView
použití PersonDataTemplateSelector
jednotlivých objektů v podkladové kolekci:
Všechny Person
objekty, které mají DateOfBirth
hodnotu vlastnosti větší nebo rovnou 1980, se zobrazí zeleně a zbývající objekty se zobrazí červeně.
Využívání dataTemplateSelector v jazyce C#
V jazyce C# PersonDataTemplateSelector
lze vytvořit instanci a přiřadit k ListView.ItemTemplate
vlastnosti, jak je znázorněno v následujícím příkladu kódu:
public class HomePageCS : ContentPage
{
DataTemplate validTemplate;
DataTemplate invalidTemplate;
public HomePageCS ()
{
...
SetupDataTemplates ();
var listView = new ListView {
ItemsSource = people,
ItemTemplate = new PersonDataTemplateSelector {
ValidTemplate = validTemplate,
InvalidTemplate = invalidTemplate }
};
Content = new StackLayout {
Margin = new Thickness (20),
Children = {
...
listView
}
};
}
...
}
Instance PersonDataTemplateSelector
nastaví své ValidTemplate
a InvalidTemplate
vlastnosti na příslušné DataTemplate
instance vytvořené metodou SetupDataTemplates
. Za běhu ListView
volá metodu PersonDataTemplateSelector.OnSelectTemplate
pro každou z položek v podkladové kolekci, přičemž volání předává datový objekt jako item
parametr. To DataTemplate
, které je vráceno metodou, se pak použije na tento objekt.
Shrnutí
Tento článek ukázal, jak vytvořit a využívat DataTemplateSelector
. A DataTemplateSelector
lze použít k výběru DataTemplate
za běhu na základě hodnoty vlastnosti vázané na data. To umožňuje použití více DataTemplate
instancí na stejný typ objektu, aby bylo možné přizpůsobit vzhled konkrétních objektů.