5

私は MVVM (および少しの WPF) を初めて使用し、ここ数日で多くの Code Project の記事、ブログの投稿、および Stackoverflow の質問を読みました。データ バインディングは、データ ソース (データベース) から読み込まれたデータを表示したり、モデルをビューと同期させたり、ビュー内のモデル データの他のすべての外観を更新したりするのに非常にうまく機能するという印象を受けました。

しかし、私はまだどのように保存し、その前に検証することが正しく機能するはずなのか、本当の手がかりはありません. 私は、Windows フォームと ADO.NET に強いバックグラウンドを持っています。私は、データベース アクセス層とビュー更新の両方のコーディングに精通しています。当時は、編集中の一時的なスクラッチ データがビューのみにあり、最後に保存されたバージョンのデータがモデル クラスとデータベースにありました。モデル クラスは通常、データベースと同期していました。まだ保存されていないデータを含むビューでした。

また、コントロールからすべてのデータを読み取り、コードで検証し、それを受け入れてモデルとデータベースに保存するか、モデルを更新せずに代わりにエラー メッセージを表示する [保存] ボタンもありました。エラーが発生した場合、ユーザー入力はユーザーが修正できるように UI に残りました。しかし、アプリケーションの他の部分はそれを見ることができませんでした。また、編集コントロールを含むビューの一部を破棄する [キャンセル] ボタンがありました。モデルはまだ有効で、変更されていません。

Model クラスからデータを公開するだけのデータ バインディングと ViewModel を使用すると、TextBox に入力された内容は、正しいかどうかにかかわらず、すぐにモデルに取り込まれます。IDataErrorInfo はそれ以上のものではありません - 情報です。気にすることも無視することもできます。強制される唯一の厳密な検証は型変換です。数値以外の文字列を数値モデル フィールドに更新することはできません。しかし、それはそれについてです。ViewModel ですべての検証を行い、無効なデータに対してプロパティ セッターから例外をスローすることで、この問題を解決します。これは、既知の動作を実装する唯一の方法です。

しかし、データの保存と破棄はどこに行くのでしょうか? 実際にデータをデータベースに書き戻すのはいつですか? TextBox を離れるたびにデータベースへの書き込みが発生するので、明示的な保存コマンドはもう必要ありません (そして元に戻すだけで元に戻せます)? データのレコード全体を検証するのはいつですか? モデルとデータベースの同期が取れておらず、無効な入力がデータ バインディングのおかげでアプリケーション全体とすべてのビューに即座に伝播することにどのように対処すればよいでしょうか? [キャンセル] ボタンでユーザー入力を破棄し、モデルを変更せずに残したり、エディター ダイアログを開く前の状態に戻すには、いつ、どのようにすればよいですか?

MVVM は、これらの基本的な問題に対する解決策を提供していないように感じます。私はそれらを逃しただけですか、それとも本当に存在しませんか? MVVM がこれに対する解決策ではない場合、それは何ですか? それとも、MVVM を WPF のデータ編集アプリケーションに使用しないほうがよいのでしょうか?

4

3 に答える 3

6

MVVM はこれらの問題に答えてくれません。選択した方法でデータベースの書き込みを解決する柔軟性 (力? 負担?) があります。データベースに保存し直す前にすべてのデータを収集する必要がある場合は、それを行うことができます。ViewModel の SaveCommand にバインドされた [保存] ボタンを追加するだけで、データ アクセス ストアド プロシージャ/エンティティ フレームワークの更新メソッドなどを実行できます。データの各ビットを個別に記録する場合は、データ アクセス プロシージャを別の場所で呼び出す必要があります (おそらくビュー モデルのプロパティ セッターですか?)。

基本的に、MVVM は完全なエンド ツー エンドのソフトウェア パターンではありません。ユーザーが見るもの (リストボックス、テキストボックス、ボタン) とアプリケーション自体の間の通信のみを確認します。データ アクセス コード、シリアライゼーション、ストレージ、永続性など、使用しているものはすべて、アプリケーション コード (モデル) で、アプリケーションの MVVM 側の背後に保持されます。これは好きなように書くことができます。

現在、ユーザーがフォームに入力して [保存] または [キャンセル] をクリックするアプリケーションを作成しています。保存とキャンセルはどちらも、ViewModel のコマンドにバインドされたボタンです。ViewModel コンストラクターでは、モデル オブジェクトのプロパティが ViewModel のプロパティにコピーされます。保存時に、ViewModel のプロパティがモデルのプロパティにコピーされ、データ アクセス コードが開始されます。キャンセルすると、モデルのプロパティが ViewModel のプロパティにコピーされます。

class MyViewModel
{
   public MyViewModel(MyModel model)
   {
      this.Name = model.Name;
      this.Colour = model.Colour;
   }

   public string Name {get;set;}
   public string Colour {get;set;}

   // commands here that connect to the following methods

   public void Save()
   {
      model.Name = this.Name;
      model.Colour = this.Colour;
      model.SaveToDatabase();
   }

   public void Cancel()
   {
      this.Name = model.Name;
      this.Colour = model.Colour;
   }

}

これは簡単な方法です。もちろん、投入する必要がINotifyPropertyChangedあり、その他のオプションもあります。しかし、この方法は何が起こっているのかを理解するのが簡単で、他に何か追加する必要があるかもしれないものを追加するための良いベースだと思います.

于 2012-07-06T13:36:27.483 に答える
1

MVVMを使用すると、ビューのコントロールをViewModelのプロパティとコマンドにバインドできます。モデルはデータベースを表します。

ユーザー入力の検証は、いくつかの方法で実行できます。テキストボックスを特定のデータのみを受け入れるように制限したり、プロパティセッターなどでデータを検証したりできます。

私はデータベースの専門家ではありませんが、VMで情報を収集し、データを検証してデータベースに書き込むビューのどこかに保存ボタンを追加します。キャンセルボタンは、VMプロパティをモデル(データベース)からの(変更されていない)値で上書きする可能性があります。

(編集:ピートの言うこと:)

于 2012-07-06T13:42:13.433 に答える
0

ViewModelとデータベースを混同していると思います。テキストボックスを離れるとき、ビューはViewModelのオブジェクトにバインドされ、TextBox内のすべてがまだメモリ内にあるViewModelのオブジェクトに割り当てられます。保存ボタンが必要になります。MVVMは、デカップリングと簡単な単体テストのために、従来のビューとコードビハインドを分離するための単なるパターンです。保存ボタンをクリックした後も、データ検証を実行する必要があります。ユーザー入力を破棄して前の状態に戻すには、編集する前にViewModelデータを保存するか、EntityFrameworkを使用してデータの変更を追跡および管理します。

于 2012-07-06T13:41:43.493 に答える