モデルからモデルビューへの変更を得るには?

私は現在、MVVMにアプリケーションを書き直すことに忙しいです(多くの作業のために、段階的に)。

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

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

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

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

3
コンテキストのサンプルコードを少し提供できますか?
追加された 著者 Erik Dietrich,

2 答え

はい、通常、モデルに INotifyPropertyChanged を実装し、ビューモデルに登録します。ビジネスエンティティに CSLA のようなフレームワークを使用している場合、Rockyは貧血対豊かなモデルについて説明します。ビューモデルのビューに直接モデルをプロパティとして公開します。

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

6
追加された
答えてくれてありがとう。私はまた、INotifyPropertyChangedの実装が私のモデルをプルートしないとは思わない。しかし、私はViewModelでそれらを持っている必要があります(私はそれがビュー自体よりも良いと思います)、または私はあなたを誤解していますか?また、モデル内のどこにでも接続することができないため、少なくともModelViewで必要なプロパティをコピーする必要があります。
追加された 著者 Michel Keijzers,
私は同じことを意味すると思います。私があなたをよく理解していれば、私はModelViewにPropertyChangedメソッドを入れなければならず、モデルを聴くべきです。これらはモデルのさまざまな部分を聴き、XAMLを介して結合されたプロパティを設定します。
追加された 著者 Michel Keijzers,
昨日私は少しでもアプリケーションを続けましたが、このソリューションを試してみる前にいくつかの項目を修正する必要があります(おそらく動作しますが、まだ実装できません)。このソリューションの実装が完了したらすぐに対応します。
追加された 著者 Michel Keijzers,
私はあなたを理解しているか分からない。 INotifyPropertyChangedは、モデルとビューモデルで実装します。ビューにモデルを公開することに満足していれば、ビューモデルにYourModel型のModelプロパティを設定します。ビュー・モデルには、モデル・データをビューにシェイプするための追加プロパティーもあります。例えば。ビューモデルにAgeプロパティがあります。モデルにはDateOfBirthプロパティのみがあります。ビューにはINotifyPropertyChangedは実装されていませんが、PropertyChangedイベントにサブスクライブされます(これはXAMLバインディングエンジンで自動的に行われます)。
追加された 著者 devdigital,

私が正しく理解すれば、モデル内のデータをプログラムで変更し、それに応じてビューモデルを介して更新されたデータを表示したいでしょうか?

代わりにコード内のviewmodelプロパティを変更し、データをロード/保存するためにのみモデルを使用することをお勧めします。

2
追加された
回答ありがとうございます。モデル内のデータを変更するのは奇妙ですか?それはViewModelで行われましたが、モデルが変更され、モデル内の変更をサブスクライブする必要があります。したがって、ViewModelを介してモデルを変更する場合、(同じ)ViewModelがモデルの変更をリッスンして、その変更をそのViewModelに接続されたWindowに反映させたいと思います。
追加された 著者 Michel Keijzers,
私はその部分を理解していますが、モデルが変更され、ModelViewでその通知が必要な場合は、モデルのさまざまな場所で多くのアイテムを購読する必要があります。リストビューの新しい選択が行われます。多分、私は上記のコードをいくつか追加するべきですが、それを読むのに時間がかかりすぎることはないでしょう。
追加された 著者 Michel Keijzers,
私が受け入れた解決策を試してみるとすぐに例を挙げます(おそらくうまくいくでしょう)。あるいは少なくとも部分的には試みましたが、この時点で私はそれを実装する時間を見つける必要があります。私は後で私の質問を編集します(もしうまくいけば)。
追加された 著者 Michel Keijzers,
私はこの問題をあまり理解していません。プロパティをgetter/setterで実装して、プロパティをモデルプロパティにマップするとします。 get {return _model.MyProperty; } {_model.MyProperty = value; OnPropertyChanged( "MyProperty"); } を実行すると、guiとモデルが更新されます。モデルプロパティを反映するviewmodelプロパティ以外の場所で、コード内のモデルプロパティにアクセスする必要はありません。
追加された 著者 eFloh,
質問を明確にするものは何でも助けます。やっているワークフローの正確な例を与えることもできます
追加された 著者 eFloh,