Udostępnij za pośrednictwem


Tworzenie elementu Xamarin.Forms DataTemplateSelector

Element DataTemplateSelector może służyć do wybierania elementu DataTemplate w czasie wykonywania na podstawie wartości właściwości powiązanej z danymi. Dzięki temu można zastosować wiele elementów DataTemplates do tego samego typu obiektu, aby dostosować wygląd określonych obiektów. W tym artykule przedstawiono sposób tworzenia i korzystania z elementu DataTemplateSelector.

Selektor szablonu danych umożliwia scenariusze, takie jak ListView powiązanie z kolekcją obiektów, gdzie wygląd każdego obiektu w obiekcie można wybrać w ListView czasie wykonywania przez selektor szablonu danych zwracający określony DataTemplateelement .

Tworzenie elementu DataTemplateSelector

Selektor szablonu danych jest implementowany przez utworzenie klasy dziedziczonej z DataTemplateSelectorklasy . OnSelectTemplate Metoda jest następnie zastępowana, aby zwrócić określony DataTemplateelement , jak pokazano w poniższym przykładzie kodu:

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 zwraca odpowiedni szablon na podstawie wartości DateOfBirth właściwości. Szablon, który ma być zwracany, to wartość ValidTemplate właściwości lub InvalidTemplate właściwości, która jest ustawiana podczas korzystania z klasy PersonDataTemplateSelector.

Wystąpienie klasy selektora szablonu danych można następnie przypisać do Xamarin.Forms właściwości kontrolek, takich jak ListView.ItemTemplate. Aby uzyskać listę prawidłowych właściwości, zobacz Tworzenie elementu DataTemplate.

Ograniczenia

DataTemplateSelector wystąpienia mają następujące ograniczenia:

  • Podklasa DataTemplateSelector musi zawsze zwracać ten sam szablon dla tych samych danych, jeśli zapytania były wykonywane wiele razy.
  • Podklasa DataTemplateSelector nie może zwracać innej DataTemplateSelector podklasy.
  • Podklasa DataTemplateSelector nie może zwracać nowych wystąpień DataTemplate obiektu w każdym wywołaniu. Zamiast tego należy zwrócić to samo wystąpienie. Niepowodzenie w tym celu spowoduje utworzenie przecieku pamięci i wyłączenie wirtualizacji.
  • W systemie Android nie może być więcej niż 20 różnych szablonów danych na ListView.

Korzystanie z elementu DataTemplateSelector w języku XAML

W języku XAML PersonDataTemplateSelector obiekt można utworzyć, deklarując go jako zasób, jak pokazano w poniższym przykładzie kodu:

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

Ten poziom ResourceDictionary strony definiuje dwa DataTemplate wystąpienia i PersonDataTemplateSelector wystąpienie. Wystąpienie PersonDataTemplateSelector ustawia jego ValidTemplate właściwości i InvalidTemplate na odpowiednie DataTemplate wystąpienia przy użyciu StaticResource rozszerzenia znaczników. Należy pamiętać, że chociaż zasoby są zdefiniowane na stronie ResourceDictionary, można je również zdefiniować na poziomie kontroli lub aplikacji.

Wystąpienie PersonDataTemplateSelector jest używane przez przypisanie go do ListView.ItemTemplate właściwości, jak pokazano w poniższym przykładzie kodu:

<ListView x:Name="listView" ItemTemplate="{StaticResource personDataTemplateSelector}" />

W czasie wykonywania ListView metoda wywołuje metodę PersonDataTemplateSelector.OnSelectTemplate dla każdego elementu w kolekcji bazowej z wywołaniem przekazującym item obiekt danych jako parametr. Metoda DataTemplate zwracana przez metodę jest następnie stosowana do tego obiektu.

Na poniższych zrzutach ekranu przedstawiono wynik ListView zastosowania obiektu PersonDataTemplateSelector do każdego obiektu w kolekcji bazowej:

ListView z selektorem szablonu danych

Każdy Person obiekt, który ma wartość właściwości większą lub równą DateOfBirth 1980, jest wyświetlany na zielono, a pozostałe obiekty są wyświetlane na czerwono.

Korzystanie z obiektu DataTemplateSelector w języku C#

W języku C# PersonDataTemplateSelector obiekt można utworzyć i przypisać do ListView.ItemTemplate właściwości, jak pokazano w poniższym przykładzie kodu:

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
      }
    };
  }
  ...  
}

Wystąpienie PersonDataTemplateSelector ustawia jego ValidTemplate właściwości i InvalidTemplate na odpowiednie DataTemplate wystąpienia utworzone przez metodę SetupDataTemplates . W czasie wykonywania ListView metoda wywołuje metodę PersonDataTemplateSelector.OnSelectTemplate dla każdego elementu w kolekcji bazowej z wywołaniem przekazującym item obiekt danych jako parametr. Metoda DataTemplate zwracana przez metodę jest następnie stosowana do tego obiektu.

Podsumowanie

W tym artykule przedstawiono sposób tworzenia i korzystania z elementu DataTemplateSelector. Element DataTemplateSelector może służyć do wybierania DataTemplate obiektu w czasie wykonywania na podstawie wartości właściwości powiązanej z danymi. Dzięki temu można zastosować wiele DataTemplate wystąpień do tego samego typu obiektu, aby dostosować wygląd określonych obiektów.