私はMVVMの記事をいくつか読んでいます。主にこれとこれです。
私の具体的な質問は次のとおりです。モデルの変更をモデルからビューモデルに伝えるにはどうすればよいですか。
ジョシュの記事では、彼がそうしているとは思えません。ViewModelは常にモデルにプロパティを要求します。レイチェルの例では、彼女はモデルを実装INotifyPropertyChanged
し、モデルからイベントを発生させていますが、それらはビュー自体が使用するためのものです(これを行う理由の詳細については、記事/コードを参照してください)。
モデルがモデルのプロパティの変更をViewModelに警告する例はどこにもありません。これはおそらくそれが何らかの理由で行われていないのではないかと心配しています。 モデルの変更をViewModelに通知するパターンはありますか? (1)各モデルに1つ以上のViewModelがあると考えられ、(2)ViewModelが1つしかなくても、モデルに対するアクションによって他のプロパティが変更される可能性があるため、このようにする必要があります。
「なぜあなたはそれをしたいのですか?」という形式の回答/コメントがあるのではないかと思います。コメントなので、これが私のプログラムの説明です。私はMVVMを使い始めたばかりなので、おそらく設計全体に問題があります。簡単に説明します。
私は「顧客」や「製品」クラスよりも(少なくとも、私にとっては)興味深いものをプログラミングしています。私はBlackJackをプログラミングしています。
背後にコードがなく、ViewModelのプロパティとコマンドへのバインドに依存しているビューがあります(Josh Smithの記事を参照)。
良くも悪くも、私はモデルのようなだけではないクラスが含まれている必要があることを態度を取ったPlayingCard
、Deck
だけでなく、BlackJackGame
ゲーム全体の状態を維持し、そしてプレイヤーがなくなっバストを持っている場合、ディーラーがカードを引くために持って知っているクラス、およびプレーヤーとディーラーの現在のスコア(21未満、21、バストなど)。
BlackJackGame
私は「DrawCard」のようなメソッドを公開し、それがいることを私に発生したカードは、以下のような、プロパティを描画する際CardScore
、およびIsBust
更新されるべきであると、これらの新しい値はViewModelにに伝達。おそらくそれは間違った考えですか?
ViewModelがDrawCard()
メソッドを呼び出したという態度を取ることができるので、更新されたスコアを要求し、バストであるかどうかを確認する必要があります。意見?
私のViewModelには、トランプの実際の画像(スーツ、ランクに基づく)を取得してビューで使用できるようにするロジックがあります。モデルはこれに関係するべきではありません(おそらく他のViewModelはトランプ画像の代わりに数字を使用するだけです)もちろん、モデルによってはBlackJackゲームの概念さえも持つべきではなく、ViewModelで処理する必要があると言う人もいるでしょう。
OnBust
でき、VMはそれをサブスクライブできます。IEAのアプローチも使用できると思います。