Отображение пользователей в виде списка
Отображение и обработка реальных данных в пользовательском интерфейсе крайне важны для работы многих приложений. В этой статье показано, что необходимо знать, чтобы отобразить коллекцию объектов Customer в списке.
Это не руководство. Если оно вам требуется, используйте наше руководство по привязке данных, в котором приводятся пошаговые инструкции.
Мы начнем с краткого обсуждения привязки данных — что это такое и как она работает. Затем мы добавим ListView в пользовательский интерфейс, добавим привязку данных и настроим дополнительные функции для привязки данных.
Что необходимо знать?
Привязка данных — это способ отображения данных приложения в пользовательском интерфейсе. Она позволяет разграничить задачи в приложении, отделив пользовательский интерфейс от другого кода. Это создает более четкую концептуальную модель, которую проще читать и поддерживать.
Каждая привязка данных состоит из следующих двух компонентов:
- источник, который предоставляет данные для привязки;
- целевой объект в пользовательском интерфейсе, в котором отображаются данные.
Для реализации привязки данных вам необходимо добавить код для источника, который предоставляет данные для привязки. Вам также следует добавить одно из двух расширений разметки в XAML, чтобы указать свойства источника данных. Ниже приведены основные различия между этими двумя типами.
- x:Bind — строго типизированный объект, который создает код во время компиляции для повышения производительности. x:Bind по умолчанию используется для единовременной привязки, которая оптимизирована для быстрого отображения данных только для чтения, которые не изменяются.
- Binding — слабо типизированный объект, который собирается во время выполнения. Это приводит к более низкой производительности по сравнению с x:Bind. В большинстве случаев следует использовать x:Bind вместо Binding. Тем не менее вы скорее встретите этот объект в старом коде. По умолчанию Binding используется для односторонней передачи данных, оптимизированной для данных только для чтения, которые могут измениться в источнике.
Мы рекомендуем использовать x:Bind, когда это возможно, и будем показывать этот объект во фрагментах кода в этой статье. Дополнительные сведения о различиях см. в разделе Сравнение компонентов расширений разметки {x:Bind} и {Binding}.
Создание источника данных
Во-первых, вам необходим класс, представляющий данные клиента. В качестве начальной точки мы покажем процесс на этом пустом примере.
public class Customer
{
public string Name { get; set; }
}
Создать список
Для отображения клиентов необходимо создать список для их хранения. ListView — базовый элемент управления XAML, который идеально подходит для выполнения этой задачи. Сейчас для ListView необходимо указать положение на странице, а через некоторое время — значение свойства ItemSource.
<ListView ItemsSource=""
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
После привязки данных с элементом ListView рекомендуется вернуться к документации и поэкспериментировать с настройкой его внешнего вида и макета в соответствии с вашими потребностями.
Привязка данных к списку
После создания базового пользовательского интерфейса для хранения привязок необходимо настроить источник, который будет их предоставлять. Вот как это можно сделать.
public sealed partial class MainPage : Page
{
public ObservableCollection<Customer> Customers { get; }
= new ObservableCollection<Customer>();
public MainPage()
{
this.InitializeComponent();
// Add some customers
this.Customers.Add(new Customer() { Name = "NAME1"});
this.Customers.Add(new Customer() { Name = "NAME2"});
this.Customers.Add(new Customer() { Name = "NAME3"});
}
}
<ListView ItemsSource="{x:Bind Customers}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Customer">
<TextBlock Text="{x:Bind Name}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
В разделе Обзор привязки данных описывается решение схожей задачи, в подразделе о привязке к коллекции элементов. В нашем примере ниже показаны следующие важные действия.
- В коде программной части пользовательского интерфейса создайте свойство типа ObservableCollection<T> для хранения объектов Customer.
- Привяжите объект ItemSource элемента ListView к этому свойству.
- Предоставьте базовый шаблон ItemTemplate для ListView, который определяет, как отображается каждый элемент в списке.
Вы можете снова изучить документацию по представлению списка, если хотите изменить макет, добавить выбор элементов или настроить DataTemplate. Но что делать, если вы хотите изменить клиентов?
Изменение клиентов в пользовательском интерфейсе
Вы вывели клиентов в списке, но привязка данных дает вам больше возможностей. Что, если бы вы могли редактировать данные непосредственно в пользовательском интерфейсе? Для этого сначала поговорим о трех режимах привязки данных:
- Одноразовый: такая привязка данных включается только один раз и не реагирует на изменения.
- Односторонний способ. Эта привязка данных обновит пользовательский интерфейс с любыми изменениями, внесенными в источник данных.
- Двухсторонняя: эта привязка данных обновит пользовательский интерфейс с любыми изменениями, внесенными в источник данных, а также обновит данные с любыми изменениями, внесенными в пользовательский интерфейс.
Если вы изучили предыдущие фрагменты кода, вы знаете, что созданная привязка использует x:Bind и не указывает режим, т. е. она является единовременной привязкой. Если вы хотите изменить клиентов непосредственно в пользовательском интерфейсе, вам необходимо сделать привязку двусторонней, чтобы изменения данных передавались в объекты Customer. Дополнительные сведения см. в статье Подробно о привязке данных.
Двусторонняя привязка также обновляет пользовательский интерфейс, если источник данных был изменен. Чтобы это работало, необходимо реализовать INotifyPropertyChanged в источнике и убедиться, что его методы задания свойств вызывают событие PropertyChanged. Общепринятая практика заключается в вызове вспомогательного метода, например OnPropertyChanged, как показано ниже.
public class Customer : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set
{
if (_name != value)
{
_name = value;
this.OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName] string propertyName = null) =>
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
Затем сделайте текст в элементе ListView доступным для редактирования, используя TextBox вместо TextBlock, и установите для свойства Mode привязок данных значение TwoWay.
<ListView ItemsSource="{x:Bind Customers}"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ListView.ItemTemplate>
<DataTemplate x:DataType="local:Customer">
<TextBox Text="{x:Bind Name, Mode=TwoWay}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Быстрый способ убедиться, что это работает, — добавить второй ListView с элементами управления TextBox и привязками OneWay. Значения во втором списке будут изменяться автоматически при редактировании первого списка.
Примечание.
Редактирование непосредственно внутри ListView — это простой способ отображения двусторонней привязки в действии, но он может усложнить использование. Для дальнейшего развития приложения можно использовать другие элементы управления XAML, которые позволяют изменять данные и сделать элемент ListView доступным только для отображения.
Дальнейшая работа
После создания списка клиентов с помощью двусторонней привязки вы можете вернуться к документам по ссылкам и поэкспериментировать. Вы также можете изучить руководство по привязке данных, чтобы ознакомиться с пошаговыми инструкциями по использованию базовых и расширенных привязок, или ознакомиться с такими элементами управления, как шаблон "Список и подробные сведения", чтобы создать более надежный пользовательский интерфейс.
Полезные интерфейсы API и документы
Вот краткое описание интерфейсов API и другая полезная документация, которая поможет вам приступить к работе с привязкой данных.
Полезные интерфейсы API
API | Description |
---|---|
Шаблон данных | Описание визуальной структуры объекта данных, которая позволяет отображать определенные элементы в пользовательском интерфейсе. |
x:Bind | Документация по рекомендуемому расширению разметки x:Bind. |
Binding | Документация по старому расширению разметки Binding. |
ListView | Элемент управления пользовательским интерфейсом, отображающий элементы данных в вертикальной стопке. |
TextBox | Базовый элемент управления текстом для отображения редактируемого текста в пользовательском интерфейсе. |
INotifyPropertyChanged | Интерфейс для отображения данных, который предоставляет их для привязки данных. |
ItemsControl | Свойство ItemsSource этого класса позволяет привязать ListView к источнику данных. |
Полезные документы
Раздел | Описание |
---|---|
Подробно о привязке данных | Общий обзор принципов привязки данных. |
Общие сведения о привязке данных | Подробные концептуальные сведения о привязке данных. |
Представление списка | Сведения о создании и настройке элемента управления ListView, в том числе о реализации DataTemplate. |
Полезные примеры кода
Пример кода | Description |
---|---|
Руководство по привязке данных | Пошаговое руководство по основам привязки данных. |
ListView и GridView | Изучите более сложные элементы ListView с привязкой данных. |
QuizGame | Ознакомьтесь с привязкой данных в действии, включая класс BindableBase (в папке "Common"), для стандартной реализации INotifyPropertyChanged. |