なべひろBlog

プログラミングをメインに仕事に関するアレコレを発信しています。

MVVMなWPFアプリでDataGridの行と列情報を取得してみる

コレ、検索してもなかなか良い感じの情報にヒットしないんですよね。

てな事で検索情報とプロパティを眺めながら試してみました。

データがBindingされていればセル内の編集された値は反映できるので行とか列の情報なんてあまり必要としません。

今回行と列の情報が必要になった経緯は

1. モニータはタッチパネルモニータである。

2. キーボードは置きたくない。

3. 数値入力だけを作業者が行う。

といった理由です。

サンプルプログラムにはありませんがDataGridの編集したいセルをタッチするとテンキーが配置されたIDialogResultが開き、作業者がテンキーから数値を入力し確定すると、行列の情報からBindingされているデータをプログラムで書き換えます。

サンプルプログラムに目的以外のコードを書くと可読性が落ちるので今回は「行」と「列」の情報を取得する事だけに的を絞ります。

コントロールの記述

DataGridの情報が必要になりますので表示するデータ以外で2つのプロパティをBindingします。

1つはSelectedIndexプロパティです。これで選択されている行の情報が取得できます。

もう1つの列情報ですが、これはCurrentCellプロパティとなります。

今回はマウスのダブルクリックイベントをキャッチして該当するメソッドを実行させる記述としてみます。

<Grid>
    <DataGrid
        ItemsSource="{Binding SettingList}"
        CurrentCell="{Binding CellInfo.Value, Mode=OneWayToSource}"
        SelectedIndex="{Binding Index.Value, Mode=OneWayToSource}"
        >
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <ri:EventToReactiveCommand Command="{Binding DataTableEvent}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </DataGrid>
</Grid>
ViewModel

列情報ですが、ViewModelで参照する列情報はCurrentCellプロパティの「Column.DisplayIndex」となります。

正直言うと面倒ですよね。

CurrentCellプロパティにRowとColumnのプロパティあってもいいじゃんと思います。

今回はDataGridのダブルクリックイベントにBindingされたDataTableEventでgetRowAndColumnメソッドを実行するだけの動作となります。

MessageBox.Show(Application.Current.MainWindow, $"クリックされたセルは\r\n行:{Index.Value}\r\n列:{CellInfo.Value.Column.DisplayIndex}\r\nです。", "Cell情報", MessageBoxButton.OK, MessageBoxImage.Information);

注意が必要なのは列ヘッダをダブルクリックしてもイベントは発生しますがその時はCellInfo.Value.ColumnがNullとなりますのでチェックが必要です。