お客様の例では、CustomerModelには、データベース(または他のバックエンド)によって保存されているすべての情報が含まれています。 CustomerViewModelにUI(名前など、大規模なクラスがある場合は50のプロパティ)に表示される場合は同様の情報が含まれますが、INotifyPropertyChangedインターフェイスを使用してView(つまりXAML)に結合する。
すべてそこにあるなど可視性フラグ、現在のタブインデックス、いくつかのフィールドのデータから構築、テキストのより複雑なビット、のObservableCollection子項目の< >、 -
public int Name
{
get
{
return this.name;
}
set
{
if (this.name!= value)
{
this.name= value;
this.OnPropertyChanged("Name");
}
}
}
は
ViewModelには、他のUIの状態のビットが含まれていますXAMLにバインドされます。
モデルから作成されたViewModelは、ワンタイム・ワンウェイ・プロセスとして見てきました。コンストラクタで:
CustomerViewModel viewModel = new CustomerViewModel(customer);
または拡張メソッド
CustomerViewModel viewModel = customer.ToViewModel();
として私は、モデルへの変更のためのViewModelを更新するためのいずれかの条項を見ていない - のViewModelのポイントは、それがから分離されたということですモデル。それはデータの別のコピーを保持します。変更をモデルに反映させるのではなく、「保存」ボタンを押すまでは反映されません。したがって、代わりにキャンセルすると、モデルの何も変更されておらず、元に戻すことはありません。
モデルでViewModelを最新の状態に保つことができない場合があります。保存や読み込みのようなほとんどの場合、現在のViewModelを放棄してモデルの現在の状態から新しいモデルを作成できます。 ViewModelのUI状態を維持し、その中のデータを変更する必要がありますか?一般的な要件ではありませんが、セーブまたはロードが発生したときに呼び出される1つまたは2つのメソッドで実行できます。
したがって、このワイヤーアップロジックがどこかで発生するという前提もあります。このため、のビューを含むほとんどのパターンには、コマンドの操作(顧客の表示、顧客の保存など)とその後の新しいUI状態の設定を担当するコントローラが含まれています。
ViewModelをモデルから分離しておく場合モデルのどのようなルールが適用されますか?私は数量と価値を持つモデルを持っているとします。新しいQtyに基づいて値を更新するモデルに流すViewModelの数量を変更した場合。これでViewModelに新しい値が表示されます。 –
「ViewModel上の数量をモデルに流す必要があります」を「いいえ」に変更した場合は、「保存」ボタンなどを押してください。そうするとき、そのハンドラはモデルを更新し、それを保持し、新しいViewModelを新しいModel状態から外す必要があります。 – Anthony
モデルに流れ込まない場合、ViewModelはどのように更新されたValueフィールドを取得しますか? Qtyを変更すると、ユーザーとして新しい値が表示されます。 MVにはValueを計算するビジネスロジックはなく、モデルのみが行います。 –