Vytvoření Xamarin.Forms DataTemplateSelector

Ukázka stažení Stažení ukázky

DataTemplateSelector lze použít k výběru datové šablony za běhu na základě hodnoty vlastnosti vázané na data. To umožňuje použít více šablon 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 šablon dat umožňuje scénáře, jako je například ListView vazba na kolekci objektů, kde vzhled každého objektu v prvku ListView lze zvolit za běhu pomocí selektoru šablony dat, který vrací konkrétní DataTemplate .

Vytvoření DataTemplateSelector

Selektor šablon dat je implementován vytvořením třídy, která dědí z DataTemplateSelector . OnSelectTemplateMetoda je pak přepsána tak, aby vracela 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;
  }
}

OnSelectTemplateMetoda vrátí příslušnou šablonu na základě hodnoty DateOfBirth Vlastnosti. Šablona, která se má vrátit, je hodnota ValidTemplate vlastnosti nebo InvalidTemplate vlastnost, která je nastavena při zpracování PersonDataTemplateSelector .

Instance třídy pro selektoru šablony dat může být přiřazena k Xamarin.Forms ovládacím prvkům vlastnosti, jako je například ListView.ItemTemplate . Seznam platných vlastností naleznete v tématu Creating a DataTemplate.

Omezení

DataTemplateSelector instance mají následující omezení:

  • DataTemplateSelectorPodtřída musí vždycky vracet stejnou šablonu pro stejná data, pokud se dotazuje víckrát.
  • DataTemplateSelectorPodtřída nesmí vracet jinou DataTemplateSelector podtřídu.
  • DataTemplateSelectorPodtřída nesmí vracet nové instance DataTemplate pro každé volání. Místo toho je nutné vrátit stejnou instanci. V takovém případě se vytvoří nevracení paměti a zakáže se virtualizace.
  • V systému Android nemůže existovat více než 20 různých datových šablon na ListView .

Použití DataTemplateSelector v jazyce XAML

V jazyce XAML PersonDataTemplateSelector lze vytvořit instanci deklarováním jako 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ň stránky ResourceDictionary definuje dvě DataTemplate instance a PersonDataTemplateSelector instanci. PersonDataTemplateSelectorInstance nastaví své ValidTemplate vlastnosti a InvalidTemplate vlastností na příslušné DataTemplate instance pomocí StaticResource rozšíření značek. Všimněte si, že i když jsou prostředky definovány na stránce ResourceDictionary , mohou být také definovány na úrovni ovládacího prvku nebo na úrovni aplikace.

PersonDataTemplateSelectorInstance 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á PersonDataTemplateSelector.OnSelectTemplate metodu pro každou položku v podkladové kolekci s voláním předání datového objektu jako item parametru. DataTemplateObjekt, který je vrácen metodou, je pak aplikován na tento objekt.

Následující snímky obrazovky ukazují výsledek ListView použití PersonDataTemplateSelector pro každý objekt v podkladové kolekci:

Zobrazení ListView pomocí voliče šablony dat

Libovolný Person objekt, který má DateOfBirth hodnotu vlastnosti větší než nebo rovno 1980, se zobrazí zeleně a zbývající objekty se zobrazí červeně.

Spotřebovávání DataTemplateSelector v jazyce C #

V jazyce C# PersonDataTemplateSelector může být vytvořena instance a přiřazena 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
      }
    };
  }
  ...  
}

PersonDataTemplateSelectorInstance nastaví své ValidTemplate vlastnosti a InvalidTemplate vlastností na příslušné DataTemplate instance vytvořené SetupDataTemplates metodou. Za běhu ListView volá PersonDataTemplateSelector.OnSelectTemplate metodu pro každou položku v podkladové kolekci s voláním předání datového objektu jako item parametru. DataTemplateObjekt, který je vrácen metodou, je pak aplikován na tento objekt.

Souhrn

Tento článek ukazuje, jak vytvořit a spotřebovat DataTemplateSelector . DataTemplateSelectorLze použít k výběru za DataTemplate běhu v závislosti na hodnotě vlastnosti vázané na data. To umožňuje DataTemplate použít více instancí na stejný typ objektu, aby bylo možné přizpůsobit vzhled konkrétních objektů.