DaraGridのイベントからセルの情報をVMで活用する。(参)

DaraGridのイベントからセルの情報をVMで活用する。(壱)
DaraGridのイベントからセルの情報をVMで活用する。(弐)
で実装した添付プロパティは、ちょっとした癖がある。

CellClicked:
 ・任意セルをクリック→別のセルをクリックでは発生しない。
 ・↑で同じセルをもう一度押すと発生する。
 ・編集可能なセルをクリックしても発生しない。
CellDoubleClicked
 ・そんなに癖はない。ダブルクリックしたら普通に発生する(筈)。
 ・CellClickedでブレークポイントを仕掛けてしまうと発生しない。(開発上の注意)
CellChanged
 ・任意セルをクリック→別のセルをクリックで発生する。
 ・カレンセル無し→任意のセルをクリックも発生する。
 ・同じセルをもう一度押しても発生しない(カレントセルが変わってないから)。
SelectionChanged
 ・アイテム(行)選択変更で発生する。
 ・コマンドパラメータは、増減分のみ入っている。
 ・DataGridのSelectionUnitが「Cell」の時は発生しない。


試しに全部設定してみた。
<DataGrid Name="PeoplesList"
AutoGenerateColumns="False"
local:DataGridExtender.CellClickedCommand="{Binding CellClickedCommand}"
local:DataGridExtender.CellDoubleClickedCommand="{Binding CellDoubleClickedCommand}"
local:DataGridExtender.CellChangedCommand="{Binding CellChangedCommand}"
local:DataGridExtender.SelectionChangedCommand="{Binding SelectionChangedCommand}"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Standard"
CanUserAddRows="False"
CanUserDeleteRows="False"
SelectionMode="Extended"
SelectionUnit="CellOrRowHeader"
ItemsSource="{Binding PersonsList}"
AlternatingRowBackground="AliceBlue"
>
<DataGrid.Columns>
(中略)
</DataGrid.Columns>
</DataGrid>

これに対するVM側の実装は省略する。弐を参考にする事。
実際にデバッグ実行してみた。
まず、任意のセルをマウスでクリック。
20120828_2
クリックしたセル:2行4列目(年齢)。バインディングしているプロパティは「Age」。
ブレークポイントを設定し、デバッグ実行で止めてみた。
20120828_1
Item1, Item2は、0起点なので、「2行4列目」と特定できる。
Item3は、バインドしているアイテム。ちゃんと「二郎」になっている。
Item4は、バインドされているプロパティ名。Item3とこれで、セルに表示されている値を取得できる。

次、同じセルをクリック。
20120828_3
セルクリック用のコマンドが呼び出された事を確認。引数の値は同じ結果になっている。

次。更にダブルクリック。
20120828_4
ダブルクリック用のコマンドが呼び出された事を確認した。
ただ、セルクリックやセル変更用のコマンドにブレークポイントを設定していると、ダブルクリックが発生しないOrz。

最後、選択変更。SelectionUnitを「CellOrRowHeader」にしてあるので、行ヘッダをクリックすることで発生する。
20120828_6
2行目を選択。
20120828_5
Item1に選択された2行目のアイテムが設定されている。
ここから更に3行目を選択すると
20120828_7
のようになる(Item1に選んだ3行目のアイテム、Item2に選択解除された2行目のアイテム)
これらを駆使して、クリックされたセルだったり、ダブルクリックされたセルだったりをVM側で活用していく。
なお、画像内にある、コマンドパラメータを受け取っているCommandParameter等は、クラスではなく、usingを使った別名である。
using CommandParameter = Tuple<int, int, object, string, bool>;
using SelectionParameter = Tuple<IList, IList, bool>;
スポンサーサイト
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0


この記事へのコメント

コメントの投稿

非公開コメント


サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m