什么是 ListView?
ListView
控件是派生自
ListBox
的
ItemsControl
控件。 通常,该控件的项为数据集合的成员,并且表示为
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>
下图演示上一个示例的数据显示方式。
通过定义继承自
ViewBase
类的类,可创建自定义视图模式。
ViewBase
类提供了创建自定义视图时所需的基础结构。 有关如何创建自定义视图的详细信息,请参阅
为 ListView 创建自定义视图模式
。
将数据绑定到 ListView
使用
Items
和
ItemsSource
属性为
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 标识的 DataTemplate 为 GridViewColumn 设置 Binding。 请注意,此示例未定义 DisplayMemberBinding,因为这样做会替代由 DataTemplate 指定的绑定。
<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 中项的宽度有影响的内容。 例如,当在 ItemContainerStyle 中设置 Margin 属性时,可能会出现对齐问题。 若要指定属性或定义对 GridView 中项的宽度有影响的内容,请使用 GridView 类及其相关类(如 GridViewColumn)的属性。
有关如何使用 及其支持类的详细信息,请参阅 GridViewGridView 概述。
如果为 ListView 控件定义 ItemContainerStyle,并同时定义 ItemTemplate,必须在样式中包含 ContentPresenter 才能使 ItemTemplate 正常工作。
对于使用 GridView 显示的 ListView 内容,请不要使用 HorizontalContentAlignment 和 VerticalContentAlignment 属性。 若要指定 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
Return _firstName
End Get
Set(ByVal value As String)
_firstName = value
End Set
End Property
Public Property LastName() As String
Return _lastName
End Get
Set(ByVal value As String)
_lastName = value
End Set
End Property
Public Property EmployeeNumber() As String
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
GridView
ListView
ListViewItem
Binding
GridView 概述
操作指南主题