ListView 概述

ListView 控件提供了使用不同布局或视图中显示一组数据项的基础结构。 例如,用户可能需要在表格中显示数据项,并同时对表格的列进行排序。

注意

你可在代码参考部分中找到本文中引用的类型。

什么是 ListView?

ListView 派生自 ListBox。 通常,该控件的项为数据集合的成员,并且表示为 ListViewItem 对象。 ListViewItem 是一个 ContentControl 且只能包含单个子元素。 但是,该子元素可以是任何视觉元素。

为 ListView 定义视图模式

若要为 ListView 控件的内容指定视图模式,请设置 View 属性。 Windows Presentation Foundation (WPF) 提供的一个视图模式为 GridView,可在具有可自定义列的表格中显示数据项集合。

下面的示例演示如何为显示员工信息的 ListView 控件定义 GridView


<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>

下图演示上一个示例的数据显示方式。

Screenshot that shows a ListView with GridView output.

通过定义继承自 ViewBase 类的类,可创建自定义视图模式。 ViewBase 类提供了创建自定义视图时所需的基础结构。 有关如何创建自定义视图的详细信息,请参阅为 ListView 创建自定义视图模式

将数据绑定到 ListView

使用 ItemsItemsSource 属性为 ListView 控件指定项。 下面的示例将 ItemsSource 属性设置为名为 EmployeeInfoDataSource 的数据集合。

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

GridView 中,GridViewColumn 对象绑定到指定的数据字段。 以下示例通过为 DisplayMemberBinding 属性指定 Binding,将 GridViewColumn 对象绑定到数据字段。

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 定义的一部分,该定义可用于对列中的单元格设置样式。 在下面的示例中,用 ResourceKey 标识的 DataTemplateGridViewColumn 设置 Binding。 请注意,此示例未定义 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}"/>

为实现 GridView 的 ListView 设置样式

ListView 控件包含 ListViewItem 对象,这些对象表示显示的数据项。 可使用以下属性定义数据项的内容和样式:

为避免 GridView 中的单元格之间出现对齐问题,不要使用 ItemContainerStyle 设置属性,或添加对 ListView 中项的宽度有影响的内容。 例如,当在 ItemContainerStyle 中设置 Margin 属性时,可能会出现对齐问题。 若要指定属性或定义对 GridView 中项的宽度有影响的内容,请使用 GridView 类及其相关类(如 GridViewColumn)的属性。

有关如何使用 及其支持类的详细信息,请参阅 GridViewGridView 概述

如果为 ListView 控件定义 ItemContainerStyle,并同时定义 ItemTemplate,必须在样式中包含 ContentPresenter 才能使 ItemTemplate 正常工作。

不要将 HorizontalContentAlignmentVerticalContentAlignment 属性用于 GridView 显示 ListView 内容。 若要指定 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
    

另请参阅