前提・実現したいこと
ViewModel(VM)とModelの区別が未だにつきません。
以下の記事のコードの例を出しますと、
サンプルコードを見ながら理解するMVVMの基礎的な実装
チュートリアルとして、Personクラスが最初にModelとして実装されています。
しかしこれでは更新されないので、INotifyPropertyChangedを実装してPersonViewModelにしています。
Modelとして実装したはずのPersonクラスが、Viewと結びつかせるためにVMになりました。
そうなるとModelとはいったい何なのでしょうか。
データを保持したり、その処理を書くのがModelだと聞きますが、上の例だとVMがModelのようにデータを保持しているように感じます。
最初は、VMとModelを完全に別にするとなると、以下のようにPersonVMクラスの中にPersonのインスタンスを作ってラップするのではないかと考えました。
C#
1PersonVM : INotifyPropertyChanged //(1) 2{ 3 Person person = new Person(); 4 public int Age{ 5 get => person.Age; 6 set { 7 person.Age = value; 8 NotifyPropertyChanged(nameof(Age)); 9 } 10 } 11}
しかしこのようにVMとMを分けると、Personに対して操作しても変更通知されません。
また、ReactivePropertyの意味や使い方がよくわからなくなってしまいます。
C#
1//こう書くのがReactivePropertyの使い方だと思っていたが、VMとModelを兼任しているためMVVMにはならない? 2PersonVM : INotifyPropertyChanged //(2) 3{ 4 public ReactiveProperty<int> Age{get;} = new ReactiveProperty<int>(); 5} 6 7//Modelに代入させることはできても、結局Modelのインスタンス内の変更通知はVMにもVにも飛ばない。 8//逆に、ModelからVMに変更通知が必要な設計が間違い? 9PersonVM : INotifyPropertyChanged //(3) 10{ 11 Person person = new Person(); 12 13 public PersonVM(){ 14 Age.Subscribe(x => person.Age = x); 15 } 16 public ReactiveProperty<int> Age{get;}= new ReactiveProperty<int>(); 17}
このPersonクラスをバイナリなりテキストなりでエクスポートする実装をするとして、
ViewModelのCommandの中で出力処理を書いてしまうのはNGだと聞きます。
(1)や(3)ならPersonクラスにメソッドを入れるなり、Personクラスを引数にするメソッドをどっかに作ったりとやりようがありますが、
(2)のようなパターンだとPersonVM内に作るか、PersonVMを引数にとらなくてはならなくなってしまいます。
データ出力のためにVMが必要ならば、それはVMがデータを保持している。つまりVMでもありModelでもあるという状況になっていないでしょうか。
このように、私の中でModelとVMの境目、分け方がわからなくなってしまい混乱しています。
どこかにMVVMの解釈に関して誤解がないか。また、どのような形でMVVMを実装するのが正しいのかの助言をいただきたいです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/12 10:42
2019/10/12 12:22
2019/10/13 01:11
2020/06/28 11:41