Value
というプロパティが付いたモデルがあるとします。モデルはINotifyPropertyChanged
を実装しています。次に、モデルを知っているビューモデルを仮定し、それ自身に架空のビューにプロパティValue
を提供します。モデルのプロパティをラップするビューモデルを実装する方法
ビューモデルのコードスニペット
public int Value
{
get {
Model.Value;
}
set {
if(value != Model.Value) {
Model.Value = value;
OnPropertyChanged();
}
}
}
すなわちを次のようにこのビューモデルが実装されていますこの時点でのビュー全体の目的は、モデルのプロパティをビューに直接渡すことです。
ビューモデルは、モデルのPropertyChanged
イベントに登録されています。モデルのValue
が変更されるたびに、ビューモデルは変更を認識してPropertyChanged
イベント自体をトリガーし、ビューモデルのプロパティーValue
にバインドするビューは自身を更新することがわかります。
1は、ビューモデルを経由してモデルを変更した場合。これは、複数のPropertyChanged
のコールをリード:
Model.Value = value;
- 私の心に来る
Value
による
OnPropertyChanged();
の唯一の解決策のセッターがcompletlyモデルからビューモデルを分離することです。これには、モデルのデータの完全なクローンを保持することも含まれます。このように私はPropertyChanged
の最初の呼び出しを避けることができます。ビューモデルの値とモデルの値を比較することができるため、さまざまなソースを区別できます(ビューモデルの変更されたモデルまたはモデルが別のソースによって変更された)。
ビューモデルははるかに複雑です。モデルをビューモデルにマージすることは解決策ではありません。
私はあなたのタイトルを完了したとは思わない... –
申し訳ありません、私はそれを修正しました。 – liondog
私はモデルを更新するためにviewmodelが必要であり、モデルは 'INotifyPropertyChanged'を実装すべきではないと思います。ビューモデル以外に誰がモデルを変更していますか?他のモデル?他のビューモデル? –