■ VisualBasic+WPF+YAML #10:DataGridのイベント 3

VBからYMALファイルを読み込みたい。
前回記事:VisualBasic+WPF+YAML #9:DataGridのイベント 2



イベントのパラメータ

DataGridからButtonをクリックした際、Commandオブジェクトではパラメータが1つしか受け取れないため、
(複数パラメータを受け取る方法は存在する筈だがうまく行っていない)
とりあえずはキーとなる項目(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
    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 件のコメント:

その他の記事