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 で複数の項目を(プログラムコードで)(インデックスを指定して)選択する」




