ListView の概要

ListView コントロールには、さまざまなレイアウトまたはビューにデータ項目のセットを表示するためのインフラストラクチャが用意されています。 たとえば、ユーザーは、テーブルにデータ項目を表示し、その列を並べ替えできます。

注意

この記事で参照されている型については、「コード リファレンス」セクションを参照してください。

ListView とは

ListView コントロールは、ListBox から派生された ItemsControl です。 通常、その項目はデータ コレクションのメンバーであり、ListViewItem オブジェクトとして表されます。 ListViewItemContentControl であり、子要素を 1 つだけ含むことができます。 ただし、その子要素は、任意のビジュアル要素にできます。

ListView の表示モードの定義

ListView コントロールの内容の表示モードを指定するには、View プロパティを設定します。 Windows Presentation Foundation (WPF) で提供されている 1 つの表示モードは 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 クラスには、カスタム ビューを作成するために必要なインフラストラクチャが用意されています。 カスタム ビューを作成する方法の詳細については、 Create a Custom View Mode for a ListView を参照してください。

ListView へのデータ バインディング

ListView コントロールの項目を指定するには、Items プロパティと ItemsSource プロパティを使用します。 次の例では、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"/>

列のセルのスタイルを指定するために使用する DataTemplate の定義の一部として、Binding を指定することもできます。 次の例では、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 オブジェクトは、表示されるデータ項目を表します。 次のプロパティを使用して、データ項目の内容とスタイルを定義できます。

GridView のセル間でのアライメントの問題を回避するために、ItemContainerStyle を使用してプロパティを設定したり、ListView の項目の幅に影響するコンテンツを追加したりしないでください。 たとえば、ItemContainerStyleMargin プロパティを設定すると、アライメントの問題が発生する可能性があります。 GridView の項目の幅に影響するプロパティを指定したり、コンテンツを定義したりするには、GridView クラスおよびそれに関連する GridViewColumn などのクラスのプロパティを使用します。

GridView およびそのサポート クラスを使用する方法の詳細については、「GridView の概要」を参照してください。

ListView コントロールの ItemContainerStyle を定義し、さらに ItemTemplate も定義する場合は、ItemTemplate が正常に動作するように、スタイルに ContentPresenter を含める必要があります。

GridView を使用して表示される ListView コンテンツには、HorizontalContentAlignment プロパティと VerticalContentAlignment プロパティを使用しないでください。 GridView の列のコンテンツの配置を指定するには、CellTemplate を定義します。

同じ表示モードの共有

2 つの 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
    

関連項目