4

モデルの一部に、モデリングしている実世界のオブジェクトの状態が含まれているMVVMアプリケーションを構築しています。状態は外部イベントから変化します。たとえば、私のモデルは、変化する株式に関する情報をTCP / IP経由で取得し、その変化を反映するように状態を更新します。

ここで、変更をビューに反映させたいと思います。そのための方法は、ViewModelに変更を通知することです。これを行うには2つの方法が考えられます。

1つは、モデルにINotifyPropertyChangedを実装させ、プロパティが変更されたときにイベントを発生させることです。しかし、これはどういうわけか眉をひそめているようです。
2つ目は、モデル内で変更できる各プロパティのイベント、ViewModelが明示的にバインドできるイベントを実装することです。

推奨される方法は何ですか?それを行う他の方法(より良い方法)はありますか?

編集:slugsterからのコメントここ
の両方で、モデルに状態を持たせることはモデルの目的ではないことを読みました。 ただし、John Gossmansの元のMVVM投稿では、 「モデルはMVCのように定義されています。状態を格納し、問題のドメインの処理を行うのは、完全にUIに依存しないデータまたはビジネスロジックです。」

4

4 に答える 4

1

モデルクラスは通常、 INotifyPropertyChangedおよび INotifyCollectionChangedインターフェイスを介してプロパティおよびコレクションの変更通知イベントを提供します。これにより、ビューでデータを簡単にバインドできます。オブジェクトのコレクションを表すモデルクラスは、通常、 ObservableCollectionクラスから派生します。

MSDN

モデルが通常INotifyPropertyChangedを実装しているとは言いませんが、そうすることを断固として拒否することはありません。より単純な(非PRISM)環境では、私の意見ではまったく問題ありません。

その後?

明確にするために:INotifyPropertyChangedは、名前が示すように、ほとんどの人が知っているように、プロパティが変更された場合の通知のインターフェイスです。ただし、これ以上ではありません。特に、WPF固有ではありません。さらに、MVVMの原則に従って、モデルはViewModelに依存しない必要があります。したがって、Publisher( Model)-Subscriber(ViewModel)-pattern(イベント)を使用する必要があることは明らかです。それで全部です。だから、あなたの質問への答えとして:Model / ViewModel間の通信を設定する方法は、あなたのスタイルと特定のタスクに依存します:

変更されたプロパティに対応したいだけの場合は、INotifyPropertyChangedを使用してください。ViewModelで、モデルのPropertyChanged -eventをサブスクライブし、変更を処理します。これは、基本的には「それらを前方にマップする」だけです。つまり、モデルプロパティの変更によって影響を受けるViewModel -propertyのPropertChangedを発生させます。

または、モデルの変更をより具体的なイベントでラップする必要がある場合、たとえば「MyDataUpdated」とすると、それについても問題は発生しません。ViewModelでこのイベントを聞いて、必要に応じて処理してください。それはまったく問題ありません。

これがお役に立てば幸いです。

編集:補足として:PropertyWeaver拡張機能を使用することをお勧めします。そうすれば、すべてのPropertyChangedなどでモデルを台無しにしないでください。

于 2012-11-12T09:43:12.227 に答える
1

オプション1で行きます。ビューモデルでモデルへの参照を保持しますが、プロパティを直接使用しないでください。代わりに、ビューモデルの独自のプロパティをモデルから設定します。ビュー モデルは、モデルから関連するプロパティのプロパティ変更通知をリッスンし、モデルから独自のプロパティを再設定できます。モデルは依然として UI に依存せず、プロパティが変更されたことを通知するだけです。

私の意見では、inotifypropertychanged 以外の独自のパブリッシャー/サブスクライバー ロジックを実行することは、それを行うメリットがない可能性があるため、やり過ぎになる可能性があります。ただし、これは、ビュー モデルにモデル参照を含める余裕があるかどうかによって異なります。私の答えは、ビュー モデルにモデル参照を含めることができるという前提に基づいています

于 2012-11-15T13:18:22.157 に答える
1

オプション 2 は実行可能ですが、ダーティではあります。インターフェイスを介して公開イベントと関数を公開することで、汚れをいくらか軽減できます。ビューモデルは、そのインターフェイスを介してのみモデルを使用します。

そうは言っても、モデルは情報の入れ物ではなく、情報の伝達手段として扱われるべきです。これは、理想的には、モデルに状態情報が含まれないようにすることを意味します。何かが受信されたときに他のコンポーネントに通知する必要があるモデルに永続的に開いているチャネルがある場合は、Prism でEventAggregatorを使用することをお勧めします。これは弱いイベント pub/sub システムであり、ビューモデルは選択したイベントにサブスクライブできます。 、モデルは必要に応じてそのイベントを発行できます (適切なペイロードと共に)。

于 2012-11-12T07:06:41.377 に答える
-1

データ バインディングの場合は**Binding**を使用できます

データバインディングの概要

于 2012-11-12T07:05:22.497 に答える