Bagikan melalui


Membuat Xamarin.Forms DataTemplateSelector

DataTemplateSelector dapat digunakan untuk memilih DataTemplate saat runtime berdasarkan nilai properti terikat data. Ini memungkinkan beberapa DataTemplates diterapkan ke jenis objek yang sama, untuk menyesuaikan tampilan objek tertentu. Artikel ini menunjukkan cara membuat dan menggunakan DataTemplateSelector.

Pemilih templat data memungkinkan skenario seperti ListView pengikatan ke kumpulan objek, di mana tampilan setiap objek dalam ListView dapat dipilih pada runtime oleh pemilih templat data yang mengembalikan pemilih templat data tertentu DataTemplate.

Membuat DataTemplateSelector

Pemilih templat data diimplementasikan dengan membuat kelas yang mewarisi dari DataTemplateSelector. Metode OnSelectTemplate ini kemudian ditimpa untuk mengembalikan , seperti DataTemplateyang ditunjukkan dalam contoh kode berikut:

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

Metode OnSelectTemplate mengembalikan templat yang sesuai berdasarkan nilai DateOfBirth properti . Templat yang akan dikembalikan adalah nilai ValidTemplate properti atau InvalidTemplate properti , yang diatur saat mengkonsumsi PersonDataTemplateSelector.

Instans kelas pemilih templat data kemudian dapat ditetapkan untuk Xamarin.Forms mengontrol properti seperti ListView.ItemTemplate. Untuk daftar properti yang valid, lihat Membuat DataTemplate.

Batasan

DataTemplateSelector instans memiliki batasan berikut:

  • Subkelas DataTemplateSelector harus selalu mengembalikan templat yang sama untuk data yang sama jika dikueri beberapa kali.
  • Subkelas DataTemplateSelector tidak boleh mengembalikan subkelas lain DataTemplateSelector .
  • Subkelas DataTemplateSelector tidak boleh mengembalikan instans baru dari DataTemplate setiap panggilan. Sebagai gantinya, instans yang sama harus dikembalikan. Kegagalan untuk melakukannya akan membuat kebocoran memori dan akan menonaktifkan virtualisasi.
  • Di Android, tidak boleh ada lebih dari 20 templat data yang berbeda per ListView.

Mengkonsumsi DataTemplateSelector di XAML

Di XAML, PersonDataTemplateSelector dapat dibuat dengan mendeklarasikannya sebagai sumber daya, seperti yang ditunjukkan dalam contoh kode berikut:

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

Tingkat ResourceDictionary halaman ini mendefinisikan dua DataTemplate instans dan instans PersonDataTemplateSelector . Instans PersonDataTemplateSelector mengatur properti dan InvalidTemplate ke ValidTemplate instans yang sesuai DataTemplate dengan menggunakan StaticResource ekstensi markup. Perhatikan bahwa sementara sumber daya didefinisikan dalam halaman ResourceDictionary, sumber daya juga dapat ditentukan pada tingkat kontrol atau tingkat aplikasi.

Instans PersonDataTemplateSelector dikonsumsi dengan menetapkannya ke ListView.ItemTemplate properti , seperti yang ditunjukkan dalam contoh kode berikut:

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

Pada runtime, ListView memanggil metode untuk setiap item dalam koleksi yang mendasarinya PersonDataTemplateSelector.OnSelectTemplate , dengan panggilan meneruskan objek data sebagai item parameter. yang dikembalikan oleh metode kemudian diterapkan ke objek tersebut DataTemplate .

Cuplikan layar berikut menunjukkan hasil ListView penerapan ke PersonDataTemplateSelector setiap objek dalam koleksi yang mendasar:

ListView dengan Pemilih Templat Data

Objek apa pun Person yang memiliki DateOfBirth nilai properti lebih besar dari atau sama dengan 1980 ditampilkan dalam warna hijau, dengan objek yang tersisa ditampilkan dalam warna merah.

Mengkonsumsi DataTemplateSelector di C#

Di C#, dapat dibuat dan ditetapkan ke ListView.ItemTemplate properti , seperti yang PersonDataTemplateSelector ditunjukkan dalam contoh kode berikut:

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

Instans PersonDataTemplateSelectorValidTemplate mengatur properti dan InvalidTemplate ke instans yang sesuai yang DataTemplate dibuat oleh SetupDataTemplates metode . Pada runtime, ListView memanggil metode untuk setiap item dalam koleksi yang mendasarinya PersonDataTemplateSelector.OnSelectTemplate , dengan panggilan meneruskan objek data sebagai item parameter. yang dikembalikan oleh metode kemudian diterapkan ke objek tersebut DataTemplate .

Ringkasan

Artikel ini telah menunjukkan cara membuat dan menggunakan DataTemplateSelector. DataTemplateSelector Dapat digunakan untuk memilih DataTemplate pada runtime berdasarkan nilai properti terikat data. Ini memungkinkan beberapa DataTemplate instans diterapkan ke jenis objek yang sama, untuk menyesuaikan tampilan objek tertentu.