私は MVVM (および少しの WPF) を初めて使用し、ここ数日で多くの Code Project の記事、ブログの投稿、および Stackoverflow の質問を読みました。データ バインディングは、データ ソース (データベース) から読み込まれたデータを表示したり、モデルをビューと同期させたり、ビュー内のモデル データの他のすべての外観を更新したりするのに非常にうまく機能するという印象を受けました。
しかし、私はまだどのように保存し、その前に検証することが正しく機能するはずなのか、本当の手がかりはありません. 私は、Windows フォームと ADO.NET に強いバックグラウンドを持っています。私は、データベース アクセス層とビュー更新の両方のコーディングに精通しています。当時は、編集中の一時的なスクラッチ データがビューのみにあり、最後に保存されたバージョンのデータがモデル クラスとデータベースにありました。モデル クラスは通常、データベースと同期していました。まだ保存されていないデータを含むビューでした。
また、コントロールからすべてのデータを読み取り、コードで検証し、それを受け入れてモデルとデータベースに保存するか、モデルを更新せずに代わりにエラー メッセージを表示する [保存] ボタンもありました。エラーが発生した場合、ユーザー入力はユーザーが修正できるように UI に残りました。しかし、アプリケーションの他の部分はそれを見ることができませんでした。また、編集コントロールを含むビューの一部を破棄する [キャンセル] ボタンがありました。モデルはまだ有効で、変更されていません。
Model クラスからデータを公開するだけのデータ バインディングと ViewModel を使用すると、TextBox に入力された内容は、正しいかどうかにかかわらず、すぐにモデルに取り込まれます。IDataErrorInfo はそれ以上のものではありません - 情報です。気にすることも無視することもできます。強制される唯一の厳密な検証は型変換です。数値以外の文字列を数値モデル フィールドに更新することはできません。しかし、それはそれについてです。ViewModel ですべての検証を行い、無効なデータに対してプロパティ セッターから例外をスローすることで、この問題を解決します。これは、既知の動作を実装する唯一の方法です。
しかし、データの保存と破棄はどこに行くのでしょうか? 実際にデータをデータベースに書き戻すのはいつですか? TextBox を離れるたびにデータベースへの書き込みが発生するので、明示的な保存コマンドはもう必要ありません (そして元に戻すだけで元に戻せます)? データのレコード全体を検証するのはいつですか? モデルとデータベースの同期が取れておらず、無効な入力がデータ バインディングのおかげでアプリケーション全体とすべてのビューに即座に伝播することにどのように対処すればよいでしょうか? [キャンセル] ボタンでユーザー入力を破棄し、モデルを変更せずに残したり、エディター ダイアログを開く前の状態に戻すには、いつ、どのようにすればよいですか?
MVVM は、これらの基本的な問題に対する解決策を提供していないように感じます。私はそれらを逃しただけですか、それとも本当に存在しませんか? MVVM がこれに対する解決策ではない場合、それは何ですか? それとも、MVVM を WPF のデータ編集アプリケーションに使用しないほうがよいのでしょうか?