初心者が迷ったReactiveCollectionとDataGridのエラーと変更フラグの集計
2016/12/05 注記
この記事のModelのコレクションをReactiveCollectionで実装する方法には、問題があります。
理由は、Schedulerのデフォルトの動作で、ReactivePropertyはViewへの更新のみがRenderingスレッドで実行されるのに対して、ReactiveCollectionのAddOnSchedulerなどの操作を行うとコレクション操作がRenderingスレッドで実行されるので、ReactivePropertyとの処理タイミングのズレが発生し、トラブルになることです。
AddOnSchedulerなどの操作を行わないなら、ObservableCollectionで十分です。
時間があれば書き直しますが、ModelではObservableCollectionを使用してください。
本文
MSDNフォーラムの質問があり、ちょうど自分も考えていたので投稿してみました。
Livetは普段使っていませんが・・・
今回の記事はその改良版です。
基本仕様
- DataGridのセルで直接編集
- IsReadOnlyプロパティで編集可・不可をチェックボックスで制御可能 (変更可)
- HasErrorsプロパティでエラー集計結果をチェックボックスで表示 (変更不可)
- IsDirtyプロパティで変更フラグの集計結果をチェックボックスで表示 (変更可)
- セルエラーは赤枠とツールチップで表示
- コレクションの操作はコンテキストメニューで行う
コレクション要素のModel
- ReactivePropertyで実装
- XYポジションのつもり
- 型はdecimal
コレクション要素のViewModel
- ReactivePropertyで実装
- Modelを文字列に変換
- Modelのエラーと変更フラグを集計
エラーや変更フラグについては過去記事やかずき大先生のブログを参照のこと。
なお、初期化時に変更フラグが立つのでコンストラクタで消しています・・・
コレクションのModel
- ReactiveCollectionで実装
- Modelのレベルでのコレクション操作可能・不可の判断フラグを持つ
- コレクション操作のメソッドを持つ
コレクションのViewModel
- ReadOnlyReactiveCollectionで実装
- コレクションの操作はModelで行うのでReadOnly
- 要素の編集は可能
- コレクションの変更・要素の変更に呼応してエラー状態や変更フラグが変化
- 動きが分かるように変更フラグはリセット出来るように実装している
- ViewModelのレベルでのコレクション操作可能・不可の判断フラグを持つ
- エラー状態にも連動
- Modelのコレクション操作のメソッドを呼び出すコマンドを持つ
コマンドでModelのメソッドを呼び出している理由は尾上大先生のこちらの記事を参照してください。
Viewのスタイル
DataGridで編集する場合にはバグがあるのでスタイルの設定で対応する必要がある。
詳細はこちらが詳しい。
DataGridの設定
- 編集モードと非編集モードのエラー表示に対応する
- コマンドはメニューから呼び出す