Бөлісу құралы:


Общие сведения о шаблонах данных Xamarin.Forms

Шаблоны данных Xamarin.Forms дают возможность настраивать представление данных в поддерживаемых элементах управления. В этой статье описываются шаблоны данных и объясняется их необходимость.

Предположим, имеется элемент ListView, в котором отображается коллекция объектов Person. В следующем примере кода показано определение класса Person.

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Location { get; set; }
}

В классе Person определены свойства Name, Age и Location, которые можно задать при создании объекта Person. Элемент ListView используется для отображения коллекции объектов Person, как показано в следующем примере кода XAML.

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:DataTemplates"
             ...>
    <StackLayout Margin="20">
        ...
        <ListView Margin="0,20,0,0">
            <ListView.ItemsSource>
                <x:Array Type="{x:Type local:Person}">
                    <local:Person Name="Steve" Age="21" Location="USA" />
                    <local:Person Name="John" Age="37" Location="USA" />
                    <local:Person Name="Tom" Age="42" Location="UK" />
                    <local:Person Name="Lucas" Age="29" Location="Germany" />
                    <local:Person Name="Tariq" Age="39" Location="UK" />
                    <local:Person Name="Jane" Age="30" Location="USA" />
                </x:Array>
            </ListView.ItemsSource>
        </ListView>
    </StackLayout>
</ContentPage>

Элементы добавляются в ListView в XAML путем инициализации свойства ItemsSource на основе массива экземпляров Person.

Примечание.

Обратите внимание на то, что для элемента x:Array требуется атрибут Type, указывающий тип элементов в массиве.

Эквивалентная страница на C# показана в следующем примере кода, в котором свойство ItemsSource инициализируется с помощью списка List экземпляров Person:

public WithoutDataTemplatePageCS()
{
    ...
    var people = new List<Person>
    {
        new Person { Name = "Steve", Age = 21, Location = "USA" },
        new Person { Name = "John", Age = 37, Location = "USA" },
        new Person { Name = "Tom", Age = 42, Location = "UK" },
        new Person { Name = "Lucas", Age = 29, Location = "Germany" },
        new Person { Name = "Tariq", Age = 39, Location = "UK" },
        new Person { Name = "Jane", Age = 30, Location = "USA" }
    };

    Content = new StackLayout
    {
        Margin = new Thickness(20),
        Children = {
            ...
            new ListView { ItemsSource = people, Margin = new Thickness(0, 20, 0, 0) }
        }
    };
}

При отображении объектов в коллекции ListView вызывает ToString. Так как переопределения Person.ToString нет, ToString возвращает имя типа каждого объекта, как показано на следующих снимках экрана.

ListView без шаблона данных

Объект Person может переопределять метод ToString для отображения осмысленных данных, как показано в следующем примере кода.

public class Person
{
  ...
  public override string ToString ()
  {
    return Name;
  }
}

В результате в ListView отображается значение свойства Person.Name для каждого объекта в коллекции, как показано на следующих снимках экрана.

ListView с шаблоном данных

Переопределение Person.ToString могло бы возвращать форматированную строку, состоящую из значений свойств Name, Age и Location. Однако такой подход не позволяет полностью контролировать внешний вид каждого элемента данных. Чтобы добиться большей гибкости, можно создать шаблон DataTemplate, определяющий внешний вид данных.

Создание DataTemplate

Шаблон DataTemplate используется для определения внешнего вида данных и обычно привязывается к данным для отображения. Стандартный сценарий его использования — отображение данных из коллекции объектов в ListView. Например, если элемент ListView привязан к коллекции объектов Person, свойству ListView.ItemTemplate присваивается шаблон DataTemplate, определяющий внешний вид каждого объекта Person в ListView. Шаблон DataTemplate будет содержать элементы, привязанные к значениям свойств каждого объекта Person. Дополнительные сведения о привязке данных см. в статье Основы привязки данных.

Шаблон DataTemplate, являющийся прямым потомком перечисленных выше свойств, называется встроенным. Кроме того, шаблон DataTemplate можно определить как ресурс на уровне элемента управления, страницы или приложения. От того, где определен стиль (DataTemplate), зависит, где его можно использовать:

  • Шаблон DataTemplate, определенный на уровне элемента управления, можно применять только к элементу управления.
  • Шаблон DataTemplate, определенный на уровне страницы, можно применять к допустимым элементам управления на странице.
  • Шаблон DataTemplate, определенный на уровне приложения, можно применять к допустимым элементам управления в приложении.

Шаблоны данных, которые находятся ниже в иерархии представлений, имеют приоритет над определенными выше в иерархии, если они имеют общие атрибуты x:Key. Например, шаблон данных на уровне приложения переопределяется шаблоном данных на уровне страницы, а шаблон данных на уровне страницы переопределяется шаблоном данных на уровне элемента управления или встроенным шаблоном данных.