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