イベントのパラメータ
DataGridからButtonをクリックした際、Commandオブジェクトではパラメータが1つしか受け取れないため、
(複数パラメータを受け取る方法は存在する筈だがうまく行っていない)
とりあえずはキーとなる項目(id)を渡し、Commandオブジェクト側(ViewModel側)でModel(TestData)より対象データを抽出することで対処する。
ClickEventCommandクラスでid値は取得できるところまでは出来ている。
さてこれからどうするか?
いい案が浮かばないが、ClickEventCommandからViewModelへイベント(ShowMessageイベント)を通知することにする。
■ClickEventCommand.vb
ViewModelでは、_ClickEventオブジェクトをWithEvents付きに変更、
ShowMessageイベントを受信できるようにする。
プログラムを実行、ボタンClickでクリックした行のidがメッセージボックスで表示されることを確認。
(複数パラメータを受け取る方法は存在する筈だがうまく行っていない)
とりあえずはキーとなる項目(id)を渡し、Commandオブジェクト側(ViewModel側)でModel(TestData)より対象データを抽出することで対処する。
ClickEventCommandクラスでid値は取得できるところまでは出来ている。
さてこれからどうするか?
いい案が浮かばないが、ClickEventCommandからViewModelへイベント(ShowMessageイベント)を通知することにする。
■ClickEventCommand.vb
Public Class ClickEventCommand Implements ICommand Public Event ShowMessage(id As Integer) Public Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged Public Sub Execute(parameter As Object) Implements ICommand.Execute RaiseEvent ShowMessage(parameter) End Sub :
ViewModelでは、_ClickEventオブジェクトをWithEvents付きに変更、
ShowMessageイベントを受信できるようにする。
Public Class ViewModel Public Property Model As New TestData() Private WithEvents _ClickEvent As ClickEventCommand Public ReadOnly Property ClickEvent As ClickEventCommand Get If (_ClickEvent Is Nothing) Then _ClickEvent = New ClickEventCommand() End If Return _ClickEvent End Get End Property Private Sub _ClickEvent_ShowMessage(id As Integer) Handles _ClickEvent.ShowMessage MessageBox.Show(id) End Sub End Class
プログラムを実行、ボタンClickでクリックした行のidがメッセージボックスで表示されることを確認。
LINQを使ってアイテムを抽出
ViewModeでクリック行のidが取得できたので、この値を元にModel(TestDataクラス)の対象アイテム(ItemDataクラス)を取得してみる。
せっかくなのでLINQというのを使ってみる。
LINQはまだ学習し始めなので雑に言うと「From x In 配列 Where 条件 x.id = id」のように書く。
xの名前は何でも良く、配列から抽出した1要素を表し、In に続き配列(コレクション)、Whereに条件を指定。
結果はコレクションで返る。
ということで、id値よりitemsを検索し、見つかったnameを表示させてみる。
■ViewModel.vb
ちなみに、LINQは次のように書くこともできる。
ついでに 選択欄のチェックした個数も表示させてみる。
しかし、チェックを外そうが付けようが常に "チェック数:2" となってしまう・・・
せっかくなのでLINQというのを使ってみる。
LINQはまだ学習し始めなので雑に言うと「From x In 配列 Where 条件 x.id = id」のように書く。
xの名前は何でも良く、配列から抽出した1要素を表し、In に続き配列(コレクション)、Whereに条件を指定。
結果はコレクションで返る。
ということで、id値よりitemsを検索し、見つかったnameを表示させてみる。
■ViewModel.vb
Private Sub _ClickEvent_ShowMessage(id As Integer) Handles _ClickEvent.ShowMessage Dim Result = From x In Model.items Where x.id = id For Each Item In Result MessageBox.Show(Item.name) Next End Subプログラムを実行し、クリック行のname値がメッセージボックスで表示されることを確認。
ちなみに、LINQは次のように書くこともできる。
' Dim Result = From x In Model.items Where x.id = id Dim Result = Model.items.Where(Function(x) x.id = id)
ついでに 選択欄のチェックした個数も表示させてみる。
Private Sub _ClickEvent_ShowMessage(id As Integer) Handles _ClickEvent.ShowMessage Dim Result = From x In Model.items Where x.id = id Dim CheckedCount = (From x In Model.items Where x.checked = True).Count() For Each Item In Result MessageBox.Show(Item.name & " チェック数:" & CheckedCount) Next End Sub
しかし、チェックを外そうが付けようが常に "チェック数:2" となってしまう・・・
次回記事:VisualBasic+WPF+YAML #11:DataGridのイベント 4
-- 以上 --
VisualBasic, WPF, DataGrid, YAML, MVVM, LINQ
0 件のコメント:
コメントを投稿