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>
下圖顯示上一個範例的資料顯示方式。
您可以透過定義一個從 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,因為這樣做的優先順序高於 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中項目寬度的內容。 例如,當您在 ItemContainerStyle 中設定 Margin 屬性時,可能會發生對齊問題。 若要指定屬性或定義會影響 GridView 中項目寬度的內容,請使用 GridView 類別及其相關類別的屬性,例如 GridViewColumn。
如需有關如何使用 GridView 及其支援類別的詳細資訊,請參閱 GridView 概觀。
如果您為 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 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