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