あなたが提供する顧客の例では、CustomerModel には、データベース (または他のバックエンド) によって保存されるすべての情報が含まれています。CustomerViewModel には、UI に表示される場合は同様の情報が含まれます (名前など、大規模なクラスがある場合は他の 50 のプロパティが含まれる可能性があります) が、INotifyPropertyChanged インターフェイスを使用して、View (つまり XAML) ができるプロパティとしてそれらを表示します。にバインドします。
例えば
public int Name
{
get
{
return this.name;
}
set
{
if (this.name!= value)
{
this.name= value;
this.OnPropertyChanged("Name");
}
}
}
ViewModel には、その他の UI 状態のビットも含まれます。可視性フラグ、現在のタブ インデックス、いくつかのフィールドのデータから作成されたより複雑なテキスト、子項目の ObservableCollection<> などです。すべてが XAML にバインドされます。
Model から作成された ViewModel が、コンストラクターなどを使用して、1 回限りの一方向のプロセスであることがわかりました。
CustomerViewModel viewModel = new CustomerViewModel(customer);
または拡張メソッドとして
CustomerViewModel viewModel = customer.ToViewModel();
モデルへの変更のために ViewModel を更新するための規定は見たことがありません。ViewModel のポイントは、モデルから分離されていることです。データの別のコピーを保持します。「保存」ボタンを押すまで、変更はモデルに反映されません。そのため、代わりにキャンセルすると、モデルは何も変更されておらず、元に戻すものはありません。
ViewModel をモデルで最新の状態に保つのに苦労している可能性があります。保存や読み込みなどのほとんどの場合、現在の ViewModel を破棄して、モデルの現在の状態から新しい ViewModel を作成できます。ViewModel の UI 状態を保持し、その中のデータを変更する必要がありますか? これは一般的な要件ではありませんが、保存または読み込みが発生したときに呼び出される 1 つまたは 2 つのメソッドで実行できます。
したがって、このワイヤーアップ ロジックがどこかで発生するという仮定もあります。これが、ビューを含むほとんどのパターンが、コマンド (顧客を表示する、顧客を保存するなど) に基づいて動作し、後で新しい UI 状態を設定する役割を担うコントローラーを含む理由です。