Sdílet prostřednictvím


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í DataTemplateobjekt .

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.ItemTemplateje . 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 jinou DataTemplateSelector podtřídu.
  • Podtřída DataTemplateSelector nesmí v každém volání vracet nové instance DataTemplate . 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:

ListView s selektorem šablony dat

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ů.