Поделиться через


Обзор ListView

Элемент ListView управления предоставляет инфраструктуру для отображения набора элементов данных с использованием другого макета или представления. Например, пользователю может потребоваться отобразить элементы данных в таблице, а также отсортировать столбцы.

Замечание

Типы, на которые ссылается эта статья, доступны в разделе справочника по коду .

Что такое ListView?

Производное ListView происходит от ListBox. Как правило, его элементы являются членами коллекции данных и представляются как ListViewItem объекты. A ListViewItem является ContentControl и может содержать только один дочерний элемент. Однако этот дочерний элемент может быть любым визуальным элементом.

Определение режима представления для ListView

Чтобы указать режим представления для содержимого ListView элемента управления, задайте View свойство. Один из режимов отображения, который предоставляет Windows Presentation Foundation (WPF), — это GridView, который показывает коллекцию элементов данных в таблице с настраиваемыми столбцами.

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


<ListView ItemsSource="{Binding Source={StaticResource EmployeeInfoDataSource}}">

    <ListView.View>

        <GridView AllowsColumnReorder="true" ColumnHeaderToolTip="Employee Information">

            <GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}" Header="First Name" Width="100"/>

            <GridViewColumn DisplayMemberBinding="{Binding Path=LastName}" Width="100">
                <GridViewColumnHeader>Last Name
                    <GridViewColumnHeader.ContextMenu>
                        <ContextMenu MenuItem.Click="LastNameCM_Click" Name="LastNameCM">
                            <MenuItem Header="Ascending" />
                            <MenuItem Header="Descending" />
                        </ContextMenu>
                    </GridViewColumnHeader.ContextMenu>
                </GridViewColumnHeader>
            </GridViewColumn>

            <GridViewColumn DisplayMemberBinding="{Binding Path=EmployeeNumber}" Header="Employee No." Width="100"/>
        </GridView>

    </ListView.View>
</ListView>

На следующем рисунке показано, как отображаются данные для предыдущего примера.

снимок экрана, на котором показан ListView с представлением данных в формате GridView.

Можно создать пользовательский режим представления, определив класс, наследуемый от ViewBase класса. Класс ViewBase предоставляет инфраструктуру, необходимую для создания пользовательского представления. Дополнительные сведения о создании пользовательского представления см. в разделе "Создание пользовательского режима представления" для ListView.

Привязка данных к ListView

Используйте свойства Items и ItemsSource, чтобы указать элементы для элемента управления ListView. В следующем примере свойству ItemsSource присваивается коллекция данных, называемая EmployeeInfoDataSource.

<ListView ItemsSource="{Binding Source={StaticResource EmployeeInfoDataSource}}">

В объекте GridView, GridViewColumn объекты привязываются к указанным полям данных. В следующем примере объект GridViewColumn привязывается к полю данных, задавая Binding для свойства DisplayMemberBinding.

GridViewColumn gvc1 = new GridViewColumn();
gvc1.DisplayMemberBinding = new Binding("FirstName");
gvc1.Header = "FirstName";
gvc1.Width = 100;
Dim gvc1 As New GridViewColumn()
gvc1.DisplayMemberBinding = New Binding("FirstName")
gvc1.Header = "FirstName"
gvc1.Width = 100
<GridViewColumn DisplayMemberBinding="{Binding Path=FirstName}" Header="First Name" Width="100"/>

Можно также указать Binding как часть DataTemplate определения, которое используется для стиля ячеек в столбце. В следующем примере DataTemplate, определённый с помощью ResourceKey, устанавливает Binding для GridViewColumn. Обратите внимание, что этот пример не определяет DisplayMemberBinding, потому что приоритет имеет CellTemplate.

<DataTemplate x:Key="myCellTemplateMonth">
  <DockPanel>
    <TextBlock Foreground="DarkBlue" HorizontalAlignment="Center">
      <TextBlock.Text>
        <Binding Path="Month"/>
      </TextBlock.Text>
    </TextBlock>
  </DockPanel>
</DataTemplate>
<GridViewColumn Header="Month" Width="80"
      CellTemplate="{StaticResource myCellTemplateMonth}"/>

Стилизация ListView с представлением в виде GridView

Элемент ListView управления содержит ListViewItem объекты, представляющие отображаемые элементы данных. Для определения содержимого и стиля элементов данных можно использовать следующие свойства:

Чтобы избежать проблем выравнивания между ячейками в GridView, не используйте ItemContainerStyle для задания свойств или добавления содержимого, влияющего на ширину элемента в ListView. Например, проблема выравнивания может возникнуть при установке свойства Margin в ItemContainerStyle. Чтобы указать свойства или определить содержимое, которое влияет на ширину элементов в объекте GridView, используйте свойства GridView класса и связанные с ним классы, например GridViewColumn.

Дополнительные сведения об использовании GridView и его вспомогательных классах см. в обзоре GridView.

Если вы задаёте ItemContainerStyle для элемента ListView управления и также определяете ItemTemplate его, необходимо включить ContentPresenter в стиль, чтобы ItemTemplate работал корректно.

Не используйте свойства HorizontalContentAlignment и VerticalContentAlignment для содержимого ListView, отображаемого с помощью GridView. Чтобы указать выравнивание содержимого в столбце GridView, задайте CellTemplate.

Общий доступ к одному режиму представления

Два ListView элемента управления не могут совместно использовать один режим представления одновременно. При попытке использовать один и тот же режим представления с несколькими ListView элементами управления возникает исключение.

Чтобы указать режим представления, который может одновременно использоваться более чем одним ListView, используйте шаблоны или стили.

Создание пользовательского режима представления

Настраиваемые представления, такие как GridView, являются производными от ViewBase абстрактного класса, который предоставляет средства для отображения элементов данных, представленных как ListViewItem объекты.

Ссылка на код

На следующие объекты ссылаются в этой статье:

  • EmployeeInfoDataSource сбор данных. Если вы используете Visual Basic .NET, элемент Window объявляется немного иначе, чем то, что вы видите в примере кода.

    <Window x:Class="SDKSample.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="OnLoad"
            xmlns:ds="clr-namespace:SDKSample">
    
        <Window.Resources>
            <ObjectDataProvider x:Key="EmployeeInfoDataSource" ObjectType="{x:Type ds:myEmployees}" />
        </Window.Resources>
    
  • EmployeeInfo класс, который используется в качестве типа для EmployeeInfoDataSource сбора данных.

    public class EmployeeInfo
    {
        private string _firstName;
        private string _lastName;
        private string _employeeNumber;
    
        public string FirstName
        {
            get {return _firstName;}
            set {_firstName = value;}
        }
    
        public string LastName
        {
            get {return _lastName;}
            set {_lastName = value;}
        }
    
        public string EmployeeNumber
        {
            get {return _employeeNumber;}
            set {_employeeNumber = value;}
        }
    
        public EmployeeInfo(string firstname, string lastname, string empnumber)
        {
            _firstName = firstname;
            _lastName = lastname;
            _employeeNumber = empnumber;
        }
    }
    
    Public Class EmployeeInfo
        Private _firstName As String
        Private _lastName As String
        Private _employeeNumber As String
    
        Public Property FirstName() As String
            Get
                Return _firstName
            End Get
            Set(ByVal value As String)
                _firstName = value
            End Set
        End Property
    
        Public Property LastName() As String
            Get
                Return _lastName
            End Get
            Set(ByVal value As String)
                _lastName = value
            End Set
        End Property
    
        Public Property EmployeeNumber() As String
            Get
                Return _employeeNumber
            End Get
            Set(ByVal value As String)
                _employeeNumber = value
            End Set
        End Property
    
        Public Sub New(ByVal firstname As String, ByVal lastname As String, ByVal empnumber As String)
            _firstName = firstname
            _lastName = lastname
            _employeeNumber = empnumber
        End Sub
    End Class
    

См. также