2013-04-22 6 views
7

私はWPFアプリケーションを開発しており、あるビューモデルと別のビューモデルを通信するにはいくつかの問題があります。WPF MVVMで2つのビューモデルを通信する

は私が持っている:

  1. MainViewModel
  2. ChildViewModel1
  3. ChildViewModel2

MainViewModel、ChildViewModel1とChildViewModel2でのプロパティの変更が通知を受ける必要があるたびに。

誰かが回避策を提案できますか?

EDIT: メッセージバスを実装している解決策MVVM Light(http://simplemvvmtoolkit.codeplex.com/SourceControl/changeset/view/23821#313594.)で考えています。それは正しいアプローチですか?

+0

あまりにも一般的です。あなた自身でこれを試す必要があります。 [INotifyPropertyChanged](http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) – tnw

+1

このタイトルは誤解を招くものであり、特定の質問はありません。 –

+1

他のMVVMフレームワークについてはわかりませんが、MVVM LightとReactiveUIには、タイトルに記載されているメッセージバスの実装が含まれています。 – kenny

答えて

4

のviewmodels自身 間で通信するための一般的な方法は、ここでtheMediatorデザインパターン

のimplimentationあるそれはプリズムでMVVMLight http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/27aaefff-e463-451c-87d9-37367a343e0e

で行われている方法である:カリバーンで http://blogs.u2u.be/diederik/post/2011/01/15/Using-the-Prism-40-Event-Aggregator.aspx

http://www.mindscapehq.com/blog/index.php/2012/02/01/caliburn-micro-part-4-the-event-aggregator/

+0

2つのリンク: 1)http://www.codeproject.com/Articles/35277/MVVM-Mediator-Pattern 2)http://joshsmithonwpf.wordpress.com/2009/04/06/a-mediator- prototype-for-wpf-apps/ – guilhermecgs

+0

@guilhermecgs、両方のリンクは私に壊れています –

+1

@ГеннадийВанинНовосибирск、両方のリンクが私のために働いています。あなたはファイアウォールの下にいないと確信していますか? – guilhermecgs

2

各ビューモデルによって実装されるIServiceを使用します。ビューモデルでは、INotifypropertychangedを実装するビューモデルのプロパティにサービスプロパティを渡すことができます。たとえば、私のビューモデルで実装されているINavigationServiceというサービスがあり、ビューモデルにバインドするCanNavigate、currentViewなどのプロパティがあります。これらのプロパティを変更すると、他のビューモデルがバインドしているナビゲーションまたは変更のプロパティが発生することがあります。

11

ほとんどの場合、EventAggregatorなどの「イベント」/「通知」を共有するために、一元的な場所を使用することはお勧めしません。これは、ViewModels間の明確ではない関係に関連する後の問題につながります。このような通知は、リスナー/パブリッシャー間の関係が設計段階であってもわからない非常に特殊なケースでは理にかなっています。 ViewModel間のリレーションシンプルなダイアグラムを作成し、標準の.NETイベントを使用する方法を見つけることをお勧めします.ViewModel1のようなViewModel間の明確なrealtionshipsがある場合、ViewModel2への参照があり、イベントを購読するか、そのようなイベント通知を簡単に作成できます。

+2

それは良い答えですが、私のアプリケーションは非常にシンプルなので、 "EventAggregator"のような "イベント"/"通知"を共有するための "集中化された場所"を使用します。参考文献やコード例がたくさんあるため、 – guilhermecgs

+0

これは非常に悪いアドバイスですそれは恐ろしいメモリリークを非常に迅速に引き起こします。 より明確に関係を見たい場合は、登録/登録解除パターンを再確認するresharperアドオンを作成することができます – Nahum

+0

このアプローチは、受け入れられた答えよりもはるかに簡単にデバッグすることができます。 –

関連する問題