Xamarin.Forms DataTemplateSelector Oluşturma

Download Sample Örneği indirme

DataTemplateSelector, veriye bağlı bir özelliğin değerine göre çalışma zamanında DataTemplate seçmek için kullanılabilir. Bu, belirli nesnelerin görünümünü özelleştirmek için aynı nesne türüne birden çok DataTemplat'ın uygulanmasını sağlar. Bu makalede DataTemplateSelector oluşturma ve kullanma işlemleri gösterilmektedir.

Veri şablonu seçicisi, içindeki her nesnenin görünümünün belirli DataTemplatebir ListView döndüren veri şablonu seçicisi tarafından çalışma zamanında seçilebildiği bir nesne ListView koleksiyonuna bağlama gibi senaryoları etkinleştirir.

DataTemplateSelector Oluşturma

Veri şablonu seçicisi, öğesinden DataTemplateSelectordevralan bir sınıf oluşturularak uygulanır. Ardından OnSelectTemplate yöntemi, aşağıdaki kod örneğinde gösterildiği gibi belirli DataTemplatebir değerini döndürmek için geçersiz kılınabilir:

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

yöntemi, OnSelectTemplate özelliğin değerine DateOfBirth göre uygun şablonu döndürür. Döndürülecek şablon, özelliğinin ValidTemplate veya özelliğinin InvalidTemplate değeridir ve bunu kullanırken PersonDataTemplateSelectorayarlanır.

Daha sonra veri şablonu seçici sınıfının bir örneği gibi ListView.ItemTemplatedenetim özelliklerine Xamarin.Forms atanabilir. Geçerli özelliklerin listesi için bkz . DataTemplate Oluşturma.

Sınırlamalar

DataTemplateSelector örnekleri aşağıdaki sınırlamalara sahiptir:

  • Alt DataTemplateSelector sınıf, birden çok kez sorgulanırsa aynı veriler için her zaman aynı şablonu döndürmelidir.
  • Alt DataTemplateSelector sınıf başka bir DataTemplateSelector alt sınıf döndürmemelidir.
  • Alt DataTemplateSelector sınıf, her çağrıda yeni bir DataTemplate örneği döndürmemelidir. Bunun yerine, aynı örnek döndürülmelidir. Bunun yapılmaması bir bellek sızıntısı oluşturur ve sanallaştırmayı devre dışı bırakır.
  • Android'de, başına ListViewen fazla 20 farklı veri şablonu olamaz.

XAML'de DataTemplateSelector Kullanma

XAML'de örneği, PersonDataTemplateSelector aşağıdaki kod örneğinde gösterildiği gibi kaynak olarak bildirilerek oluşturulabilir:

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

Bu sayfa düzeyi ResourceDictionary iki DataTemplate örneği ve bir PersonDataTemplateSelector örneği tanımlar. Örnek, PersonDataTemplateSelector işaretleme uzantısını ValidTemplate kullanarak ve InvalidTemplate özelliklerini uygun DataTemplate örneklere StaticResource ayarlar. Kaynaklar sayfanın ResourceDictionaryiçinde tanımlanmış olsa da, denetim düzeyinde veya uygulama düzeyinde de tanımlanabilir.

Örnek PersonDataTemplateSelector , aşağıdaki kod örneğinde gösterildiği gibi özelliğine ListView.ItemTemplate atanarak tüketilir:

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

Çalışma zamanında, ListView çağrısı veri nesnesini parametre olarak item geçirirken, temel koleksiyondaki öğelerin her biri için yöntemini çağırırPersonDataTemplateSelector.OnSelectTemplate. DataTemplate Yöntemi tarafından döndürülen daha sonra bu nesneye uygulanır.

Aşağıdaki ekran görüntüleri, temel alınan koleksiyondaki ListView her nesneye uygulamasının PersonDataTemplateSelector sonucunu gösterir:

ListView with a Data Template Selector

1980'den büyük veya 1980'e eşit bir DateOfBirth özellik değerine sahip olan tüm Person nesneler yeşil renkte görüntülenir ve kalan nesneler kırmızı olarak görüntülenir.

C'de DataTemplateSelector Kullanma#

C# dilinde örneği PersonDataTemplateSelector oluşturulabilir ve aşağıdaki kod örneğinde gösterildiği gibi özelliğine atanabilir ListView.ItemTemplate :

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

ÖrnekPersonDataTemplateSelector, ve InvalidTemplate özelliklerini yöntemi tarafından oluşturulan uygun DataTemplate örneklere SetupDataTemplates ayarlarValidTemplate. Çalışma zamanında, ListView çağrısı veri nesnesini parametre olarak item geçirirken, temel koleksiyondaki öğelerin her biri için yöntemini çağırırPersonDataTemplateSelector.OnSelectTemplate. DataTemplate Yöntemi tarafından döndürülen daha sonra bu nesneye uygulanır.

Özet

Bu makalede, oluşturma DataTemplateSelectorve kullanma işlemi gösterilmiştir. , DataTemplateSelector veriye bağlı bir özelliğin değerine göre çalışma zamanında seçmek DataTemplate için kullanılabilir. Bu, belirli nesnelerin görünümünü özelleştirmek için aynı nesne türüne birden çok DataTemplate örneğin uygulanmasını sağlar.