MVVMを勉強してから実際にアプリを作ろうとして悩んだ点について。
Modelのプロパティの値をView(XAML)上のコントロールにバインドしたい時、INotifyPropertyChangedはViewModelで実装するべき?Modelで実装するべき?(あるいは両方で実装?)
結論:Modelで実装。
なぜこんな簡単な事で悩んでしまったかというと・・・
ViewModelのベースクラスがINotifyPropertyChangedインタフェースを実装しているサンプルを複数確認。
それを見て、ViewModelで実装するものだと勘違いしてしまった自分の理解不足が原因。
ModelはViewModelが公開するもの。
→ INotifyPropertyChanged を実装した ViewModel が Model の プロパティ をラップすればよいのでは?という飛躍した発想をしてしまいました。
この方法だと、一つの Model を複数の ViewModel から利用する時に困ります。
(Modelを利用する複数の ViewModel のうちいずれかが Model のプロパティに変更を加えた時、変更の通知を受け取れない View がある)
まずはMVVMの原則。
・プロパティ値の変更をViewに伝える方法は INotifyPropertyChanged を利用するのが一般的。(ただし、唯一の方法ではない)
・INotifyPropertyChanged は、変更の通知を行いたいクラスで実装する。
INotifyPropertyChanged は、View がバインドしているクラスで実装するべき。
Modelのプロパティをバインドしたいなら、Modelで実装するのが正解。
という結論に達しました。
ただし、Model の変更通知の話とは別に ViewModel が INotifyPropertyChanged を実装するケースが多いため、結果として ViewModel とModel の両方が INotifyPropertyChanged を実装する事になると思います。