Общие сведения о шаблонах данных 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
возвращает имя типа каждого объекта, как показано на следующих снимках экрана.
Объект Person
может переопределять метод ToString
для отображения осмысленных данных, как показано в следующем примере кода.
public class Person
{
...
public override string ToString ()
{
return Name;
}
}
В результате в ListView
отображается значение свойства Person.Name
для каждого объекта в коллекции, как показано на следующих снимках экрана.
Переопределение 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
. Например, шаблон данных на уровне приложения переопределяется шаблоном данных на уровне страницы, а шаблон данных на уровне страницы переопределяется шаблоном данных на уровне элемента управления или встроенным шаблоном данных.