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 DataTemplate
element .
Tworzenie elementu DataTemplateSelector
Selektor szablonu danych jest implementowany przez utworzenie klasy dziedziczonej z DataTemplateSelector
klasy . OnSelectTemplate
Metoda jest następnie zastępowana, aby zwrócić określony DataTemplate
element , 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ć innejDataTemplateSelector
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:
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.