【VB.NET】【WPF】ListView の基本的な使い方

ListView の基本的な使い方です。

やり方(バリエーション)はいくつか考えられるので、こうでなければいけないということではありません。

空の ListView を作成する

下図のような空の ListView を作るには・・・

下記のような xaml を記述する。Binding の名前(DayOfTheWeek、StartTime、EndTime)は、このあと作成するクラスのプロパティ名にバインドされる。

<ListView Name="ScheduleListView" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="10">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="70" DisplayMemberBinding="{Binding DayOfTheWeek}">
                <GridViewColumnHeader Content="曜日"/>
            </GridViewColumn>
            <GridViewColumn Width="70" DisplayMemberBinding="{Binding StartTime}">
                <GridViewColumnHeader Content="開始時刻" />
            </GridViewColumn>
            <GridViewColumn Width="70" DisplayMemberBinding="{Binding EndTime}">
                <GridViewColumnHeader Content="終了時刻" />
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

ListView にデータを追加する

前述の ListView に下図のようなデータを追加するには・・・

下記のようなコードを記述する。

Imports System.Collections.ObjectModel 'ObservableCollection 用

Class MainWindow

	' ListView では通常 ObservableCollection を使用する。
	' ObservableCollection は INotifyCollectionChanged を実装・継承している。
	Dim g_ItemsSource As New ObservableCollection(Of ScheduleItemClass)

	Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
		' ListView に ObservableCollection 型の変数を割り当てる。
		Me.ScheduleListView.ItemsSource = g_ItemsSource

		'ObservableCollection に対する変更は ListView に反映される。
		g_ItemsSource.Add(New ScheduleItemClass("水", "07:00", "16:00"))
		g_ItemsSource.Add(New ScheduleItemClass("日", "10:00", "19:00"))
		g_ItemsSource.Add(New ScheduleItemClass("土", "11:00", "20:00"))
		g_ItemsSource.Add(New ScheduleItemClass("火", "08:00", "17:00"))
		g_ItemsSource.Add(New ScheduleItemClass("木", "13:00", "22:00"))
		g_ItemsSource.Add(New ScheduleItemClass("月", "09:00", "18:00"))
		g_ItemsSource.Add(New ScheduleItemClass("金", "12:00", "21:00"))
	End Sub

	'ListView の各アイテムを表すクラス
	Class ScheduleItemClass
	    'このプロパティを xaml でバインドしている
	    Public Property DayOfTheWeek As String
	    Public Property StartTime As String
	    Public Property EndTime As String

	    Sub New(_DayOfTheWeek As String, _StartTime As String, _EndTime As String)
	        Me.DayOfTheWeek = _DayOfTheWeek
	        Me.StartTime = _StartTime
	        Me.EndTime = _EndTime
	    End Sub
	End Class

End Class

ListView のデータをソートする

コード量が多くなるので記事を別にしました。「【VB.NET】【WPF】ListView でのソート」を参照してください。

ListView の選択アイテムを削除する

前述のウィンドウに削除ボタンを追加したと想定します。ボタンの名前は Delete とします。

下記が Delete ボタンの Click イベントのコードです。

Private Sub Delete_Click(sender As Object, e As RoutedEventArgs) Handles Delete.Click

	' ObservableCollection のデフォルトのビューを取得
	Dim oView As ListCollectionView = CType(CollectionViewSource.GetDefaultView(g_ItemsSource), ListCollectionView)



	'--------------------------------
	'↓これは本来は不要なコード。項目の並び順を確認するため。
	Dim s As String = ""
	s &= "元の ObservableCollection" & vbCrLf
	s &= "-------------------------" & vbCrLf
	For i As Integer = 0 To g_ItemsSource.Count -1
	    s &= CType( g_ItemsSource.Item(i), ScheduleItemClass).DayOfTheWeek & vbCrLf
	Next
	s &= vbCrLf
	s &= "デフォルトのビュー" & vbCrLf
	s &= "-------------------------" & vbCrLf
	For i As Integer = 0 To oView.Count -1
	    s &= CType( oView.GetItemAt(i), ScheduleItemClass).DayOfTheWeek & vbCrLf
	Next
	MsgBox(s)
	'--------------------------------



	Dim oListView As ListView = Me.ScheduleListView

	Do While oListView.SelectedItems.Count > 0
	    ' ListView.SelectedIndex の値は元の ObservableCollection と一致しないことがある
	    '(ListView 上でソートしている場合など)ので、
	    'ここで g_ItemsSource.RemoveAt を使ってはダメ。
	    oView.RemoveAt(oListView.SelectedIndex)
	Loop

End Sub

上のコードのコメントに書いている通り、ListView で選択中のアイテムのインデックスは元の ObservableCollection データのインデックスと一致しないことがあるので、ObservableCollection からデフォルトのビューを取得して、ビューからアイテムを削除したほうが安全です(ビューからアイテムを削除すると、元の ObservableCollection のデータからも削除されます)。

上のコードの中に元の ObservableCollection の中身とデフォルトのビューの中身を比較表示するコードを入れておきました。その表示を見てみましょう。

下図はデフォルトの表示のとき(ソート無し)に削除ボタンをクリックした場合。

下図はユーザーが曜日で昇順ソートしたときに削除ボタンをクリックした場合。

ListView のアイテムの内容を変更する

ListView のアイテムの中身を変更した場合、ListView の表示に反映させるには、デフォルトのビューで .Refresh を実行する必要があります。

Dim oView As ListCollectionView = CType(CollectionViewSource.GetDefaultView(g_ItemsSource), ListCollectionView)
Dim item As ScheduleItemClass = oView.GetItemAt(0)
item.DayOfTheWeek = "(*'ω'*)"

oView.Refresh

ListView で複数の選択項目のインデックスを取得する

下記を参照してください。

【VB.NET】【WPF】ListBox / ListView で複数の選択項目のインデックスを取得する

ListView で複数の項目を(プログラムコードで)(インデックスを指定して)選択する

下記を参照してください。

【VB.NET】【WPF】ListBox / ListView で複数の項目を(プログラムコードで)(インデックスを指定して)選択する

 

コメントの投稿

avatar
  購読する  
通知を受け取る対象