読者です 読者をやめる 読者になる 読者になる

tmori3y2のブログ

主にWindowsのプログラムなど

初心者が迷ったReactiveCollectionとDataGridのエラーと変更フラグの集計

C# WPF MVVM ReactiveProperty

2016/12/05 注記

この記事のModelのコレクションをReactiveCollectionで実装する方法には、問題があります。

理由は、Schedulerのデフォルトの動作で、ReactivePropertyはViewへの更新のみがRenderingスレッドで実行されるのに対して、ReactiveCollectionのAddOnSchedulerなどの操作を行うとコレクション操作がRenderingスレッドで実行されるので、ReactivePropertyとの処理タイミングのズレが発生し、トラブルになることです。

AddOnSchedulerなどの操作を行わないなら、ObservableCollectionで十分です。

時間があれば書き直しますが、ModelではObservableCollectionを使用してください。

本文

DataGrid 数値入力 エラー時 画面操作

MSDNフォーラムの質問があり、ちょうど自分も考えていたので投稿してみました。

Livetは普段使っていませんが・・・

今回の記事はその改良版です。

基本仕様

f:id:tmori3y2:20160217020023p:plain

コレクション要素のModel
  • ReactivePropertyで実装
  • XYポジションのつもり
  • 型はdecimal
コレクション要素のViewModel
  • ReactivePropertyで実装
  • Modelを文字列に変換
  • Modelのエラーと変更フラグを集計

エラーや変更フラグについては過去記事やかずき大先生のブログを参照のこと。

なお、初期化時に変更フラグが立つのでコンストラクタで消しています・・・

コレクションのModel
  • ReactiveCollectionで実装
  • Modelのレベルでのコレクション操作可能・不可の判断フラグを持つ
  • コレクション操作のメソッドを持つ
コレクションのViewModel
  • ReadOnlyReactiveCollectionで実装
    • コレクションの操作はModelで行うのでReadOnly
    • 要素の編集は可能
  • コレクションの変更・要素の変更に呼応してエラー状態や変更フラグが変化
    • 動きが分かるように変更フラグはリセット出来るように実装している
  • ViewModelのレベルでのコレクション操作可能・不可の判断フラグを持つ
    • エラー状態にも連動
  • Modelのコレクション操作のメソッドを呼び出すコマンドを持つ

コマンドでModelのメソッドを呼び出している理由は尾上大先生のこちらの記事を参照してください。

ugaya40.hateblo.jp

Viewのスタイル

DataGridで編集する場合にはバグがあるのでスタイルの設定で対応する必要がある。

詳細はこちらが詳しい。

thinkami.hatenablog.com

DataGridの設定
  • 編集モードと非編集モードのエラー表示に対応する
  • コマンドはメニューから呼び出す

ソースコード

github.com