ListView 控件提供基础结构,用于使用不同的布局或视图显示一组数据项。 例如,用户可能想要在表中显示数据项并对其列进行排序。
注释
本文中引用的类型在 代码参考 部分提供。
什么是 ListView?
ListView 派生自 ListBox。 通常,其项是数据集合的成员,并被表示为 ListViewItem 对象。 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>
以下插图展示了数据在上一个示例中的呈现方式。
可以通过定义继承自 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}"/>
为实现 GridView 的 ListView 设置样式
ListView 控件包含 ListViewItem 对象,这些对象表示显示的数据项。 可以使用以下属性来定义数据项的内容和样式:
在 ListView 控件上,使用 ItemTemplate、ItemTemplateSelector和 ItemContainerStyle 属性。
在 ListViewItem 控件上,使用 ContentTemplate 和 ContentTemplateSelector 属性。
为了避免 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