WPFのDataGridについて

WPFのDataGridではセルは編集中とそれ以外で表示するコントロールを切り替えることができ、
列ごとに種類を決めることがでます。

自分でテンプレートを設定できるDataGridTemplateColumnのほかに
編集中はTextBox、それ以外ではTextBlockになるDataGridTextColumn,
編集中はCombobox、それ以外ではTextBlockになるDataGridComboBoxColumn,
編集中も非編集中もCheckBoxな、DataGridCheckBoxColumn等が
あらかじめ用意されています。

セルの編集完了時、編集キャンセル時にCellEditEndingイベントが発生します。
編集中の列、行はそれぞれ
DataGridCellEditEndingEventArgsのメンバColumn、Rowで取得でき、
編集中のコントロール(ContentPesenter,TextBox,ComboBox,CheckBoxなど)はEditingElement
今が編集確定時、キャンセル時のどちらかなのかは、EditActionで取得できます。
また、Cancelにtrueを代入するとイベント終了後も編集状態を維持することができます。
ただし、Tabキーなどで選択セルを変更した場合遷移前と遷移後の両方のセルが編集状態になってしまうことがあるので注意が必要です。

行の編集が完了した時にはRowEditEndingイベントが発生します。
コントロールに入力した値がバインドしたViewModelに反映されるのはこのイベントの発生後になります。
そのためセルや行の編集中にセルに表示されている値を使用したい場合
ViewModelからではなく、コントロールから直接値を取得する必要があります。
DataGrid〇〇Columnオブジェクトから、編集時、非編集時の表示用コントロールを取得するには、
メンバのGetCellContent(DataGridRow)関数を使用します。
DataGridTemplateColumnの場合には取得できるのはContentPresenterなので
そこからテンプレートで指定したコントロールを取得する必要があり、
VisualTreeHelper.GetChild(DependencyObject,int)を使用することで実現できます。

セルが編集モードになる時には、PreparingCellForEditイベントが発生するので
編集中コントロールにデータを直接渡す必要があるときなどに使うと便利です。

akatukisiden について

フリーランスプログラマ 使用言語はC++,C#とそのつなぎのC++/CLI 専門はクライアントアプリ開発
カテゴリー: C#, MVVM, XAML環境 タグ: , , , , , , , パーマリンク

コメントを残す