Список ListView является наследником элемента управления ListBox, который мы рассматривали в предыдущей части и по умолчанию предназначен для отображения данных в виде таблицы со строками и столбцами, но может поддерживать и другие способы отображения. В этой части мы рассмотрим работу с ListView в WPF.
ListView, не затрагивая вопросы использования свойств и событий родительских классов, таких как ItemsControl и Selector. Поэтому, прежде, чем приступать к изучению этого материала, ознакомьтесь с этой частью руководства в которой рассмотрены основные моменты по работе со списками элементов в WPF в принципе.Список ListView
Работа в режиме ListBox
Так как ListView является прямым наследником класса ListBox, то он может работать также, как и свой предок. Например, создадим обычный список выбора
<ListView IsEnabled="True" SelectionMode="Extended">
<ListViewItem>Первый элемента</ListViewItem>
<ListViewItem>Второй элемента</ListViewItem>
<ListViewItem>Третий элемента</ListViewItem>
</ListView>
В приложении этот ListView будет выглядеть следующим образом:
Однако, использовать для обычного списка выбора ListView не совсем удачное решение, как минимум, по причине производительности. Поэтому рассмотрим то, как можно использовать ListView по его назначению, то есть для отображения элементов в виде табличной структуры.
Использование свойства View
Элемент ListView предоставляет нам такое новое свойство, как
public ViewBase View { get; set; }
которое и определяет внешний вид всего списка элементов. На данный момент в WPF реализован наследник ViewBase — класс GridView, который позволяет отображать элементы ListView в виде таблицы. Для того, чтобы продемонстрировать работу с этим объектом, добавим в наш проект новый класс, свойства которого будут отображаться в ListView:
public class Person
{
public string Name { get; set; }
public string Surname { get; set; }
public int Age { get; set; }
}
Теперь изменим код класса MainWindow следующим образом:
public partial class MainWindow : Window
{
private readonly List<Person> _people;
public MainWindow()
{
_people = new List<Person>()
{
new Person(){Name="Иван", Surname="Иванов", Age=18 },
new Person(){Name="Петров", Surname="Пётр", Age=25 },
new Person(){Name="Семенов", Surname="Семён", Age=26 },
};
InitializeComponent();
list.ItemsSource = _people;
}
}
здесь мы объявили поле только для чтения — список объектов класса Person:
private readonly List<Person> _people;
который мы заполняем в конструкторе класса и назначаем в качестве свойства ItemSource списку ListView:
list.ItemsSource = _people;
Теперь изменим код XAML:
<ListView x:Name="list" IsEnabled="True" SelectionMode="Extended">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Path=Name}">Имя</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=Surname}" Width="100">Фамилия</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=Age}">Возраст</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
Здесь мы воспользовались свойством ListView.View и определили объект типа GridView, который содержит три столбца:
<GridViewColumn DisplayMemberBinding="{Binding Path=Name}">Имя</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=Surname}" Width="100">Фамилия</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=Age}">Возраст</GridViewColumn>
Для каждого из столбцов мы определили привязку к данным элементов списка, используя расширение разметки Binding. Например,
DisplayMemberBinding="{Binding Path=Name}"
означает, что значение свойства DisplayMemberBinding у GridViewColumn будет содержать значение свойства Name объекта Person. Теперь наш список будет выглядеть следующим образом:
Также мы можем настроить GridView, например, для показа подсказки заголовков и перемещения столбцов таблицы, используя свойства ColumnHeaderToolTip и AllowsColumnReorder соответственно:
<ListView x:Name="list" IsEnabled="True" SelectionMode="Extended">
<ListView.View>
<GridView AllowsColumnReorder="True" ColumnHeaderToolTip="Список людей" >
<GridViewColumn DisplayMemberBinding="{Binding Path=Name}">Имя</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=Surname}" Width="100">Фамилия</GridViewColumn>
<GridViewColumn DisplayMemberBinding="{Binding Path=Age}">Возраст</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
Итого
Список ListView является наследником ListBox и позволяет отображать как обычный список элементов, так и список элементов в виде таблицы. Для отображения таблицы используется свойство View в котором определяется содержимое списка в виде объекта типа GridView.


