2012-02-06 17 views
3

私は現在MVVMにアプリケーションを書き直すことに忙しくています(多くの作業のために段階的に)。モデルからモデルビューへの変更を取得する方法は?

現在、モデルビューの変更に応じてリストビューとコントロールを塗りつぶすことができます。また、リストビューの選択も正しく結合されています(少なくとも私は正しく行う方法を知っています)。

しかし、私はモデルビューに反映されるモデルの変更について考えていました。モデルのすべてのアイテムにINotifyPropertyChangeインターフェイスを追加し、modelviewに登録する必要があります(モデル階層の 'トップ'にないアイテムを購読したい場合はチェーンのようなものでしょうか)。

など。私はリストBを含むリストAを持っています。リストBのプロパティー変更のためにリストAで購読する必要がありますか?リストAにサブスクライブするモデルビューでは?別のリスト選択が行われた場合には、購読を停止して購読を停止することができます。

読んでいただきありがとうございます。

+0

コンテキストのサンプルコードを少し提供できますか? –

答えて

6

通常、ご使用のモデルにINotifyPropertyChangedを実装し、ビューモデルでサブスクライブします。あなたのビジネスエンティティにCSLAのようなフレームワークを使用している場合、Rockyは貧血対豊かなモデルを記述します。後者では、モデルをプロパティとしてビューモデルのビューに直接公開します。

私はINotifyPropertyChangedは安定した依存関係だと思うので、あなたのモデルをかなり汚染することはありません。ビューに直接モデルを公開することは好きではない人もいますが、多くのコードやリピートコードを保存することができます。そうしないと、ビューモデルは値を追加せずにモデルの多くのプロパティを複製することになります。

+0

お返事ありがとうございます。私はまた、INotifyPropertyChangedの実装が私のモデルをプルートしないとは思わない。しかし、私はViewModelでそれらを持っている必要があります(私はそれがビュー自体よりも良いと思います)、または私はあなたを誤解していますか?また、モデル内のどこにでも接続することができないため、少なくともModelViewで必要なプロパティをコピーする必要があります。 –

+0

私はあなたを理解しているか分からない。 INotifyPropertyChangedは、モデルとビューモデルで実装します。ビューにモデルを公開することに満足していれば、ビューモデルにYourModel型のModelプロパティを設定します。ビュー・モデルには、モデル・データをビューにシェイプするための追加プロパティーもあります。例えば。ビューモデルにAgeプロパティがあります。モデルにはDateOfBirthプロパティのみがあります。ビューにはINotifyPropertyChangedは実装されていませんが、PropertyChangedイベントにサブスクライブされます(これはXAMLバインディングエンジンで自動的に行われます)。 – devdigital

+0

私は同じことを意味すると思います。私があなたをよく理解していれば、私はModelViewにPropertyChangedメソッドを入れなければならず、モデルを聴くべきです。これらはモデルのさまざまな部分を聴き、XAMLを介して結合されたプロパティを設定します。 –

2

私が正しく理解していれば、モデル内のデータをプログラムで変更し、それに応じて更新されたデータを表示する必要がありますか?

代わりにコードのviewmodelプロパティを変更して、そのモデルを読み込んだ/保存するだけでその問題を解消することをお勧めします。

+0

お返事ありがとうございます。モデル内のデータを変更するのは奇妙ですか?それはViewModelで行われましたが、モデルが変更され、モデル内の変更をサブスクライブする必要があります。したがって、ViewModelを介してモデルを変更する場合、(同じ)ViewModelがモデルの変更をリッスンして、その変更をそのViewModelに接続されたWindowに反映させたいと思います。 –

+0

私はこの問題をよく理解していません。getter/setterプロパティを実装して、プロパティをモデルプロパティにマップするとします。 'get {return _model.MyProperty; } {_model.MyProperty = value; OnPropertyChanged( "MyProperty"); } '、guiとモデルが更新されます。モデルプロパティを反映するviewmodelプロパティ以外のどこでもコード内のモデルプロパティにアクセスする必要はありません。 – eFloh

+0

モデルが変更され、ModelViewで通知が必要な場合は、購読する必要がありますモデル内のさまざまな場所にある多くのアイテムにもアクセスできます。リストビューの新しい選択が行われます。多分、私は上記のコードをいくつか追加するべきですが、それを読むのに時間がかかりすぎることはないでしょう。 –

関連する問題