2009-11-20 3 views
7

を使用してSilverlightで指揮使用してMVVMで2つのビューモデルとの間の通信します。Silverlightは - (DelegateEventとICommandの)</p> <p>私はこのような何かをしたい、(例えば)私が持っている2人のユーザーコントロール、親と子を私はMVVMに取り組んでいますコマンド

親が子をホストしていて、どちらも独自のビューモデルを持っています。

親にはボタンがあり、それは簡単なコマンドを実行します。そのコマンドを実行すると、子コントロールのテキストボックスのテキストを更新します。また、親に伝播することができる子供の中で何かを変えることができるはずです。

イベントはこれに対して最善の答えですか、何らかの方法で子/通知の親を更新するコマンドを持つことができます。

答えて

12

これについてはいくつかの方法があります。

まず、他のViewModelで構成されているViewModelは、そのように結合されていればOKです。あなたがそうするとき、彼らはちょうど通常のメソッド呼び出しを使用してお互いに話すことができます。

次に、ビットをデカップリングしてイベントを使用できます。それには何も問題ありません。 Observer - > Observableカップリングがまだありますが、お互いの依存度が低いです。

次に、EventAggregatorのようなものを完全に切り離して使用することができます(Prismには良いものがあります)。メッセージを公開してください。他のメンバーは購読します。彼らはお互いを全く知りません。

私はこれも同様にコマンドを使用しましたが、ViewModelからViewModelへの通信では、これは少し厄介なものです。

4

これは、Composite Application Guidance/PrismのようなEventAggregatorを使用するのに理想的です。

このモデルでは、アプリケーション(または他の共通領域)のルートにMessageBusを設定できます。 App.xaml.cs

のpublic static IEventAggregator MessageBus =新しいEventAggregator()内

//;

はその後、共通のメッセージライブラリSimpleObjectがこのイベントを処理するために必要なすべての情報が含まれているクラスまたは変数である

// in Messages.cs 

    public class SimpleCommand: CompositePresentationEvent<SimpleObject> { } 

を設定します。

// in control with button 

    App.MessageBus.GetEvent<Messages.SimpleCommand>().Publish(SimpleObject); 

// anywhere in your app that you "care" about this 

    App.MessageBus.GetEvent<Messages.SimpleCommand>().Subscribe(ProcessingMethod); 

ProcessingMethodは、パラメータとしてSimpleObjectを使用するメソッドです。

次に、どこからでもメッセージを吹き出して、ビューモデルやコントロールなどのどこからでもメッセージを処理できます。アプリケーションの一部を動的に読み込む場合は、コンポーネント間でMessageBusを渡すこともできます。うまくいく。

+2

私はこの種のイベントセットアップに混乱していますが、ネストされたコントロールは複数のビューに存在します。これはネストされたコントロール(ビューとビューモデル)であるため、再利用可能な機能のためにネストされていると見なすのが妥当です。単純なイベントが使用されている場合、他のビューにあるものの代わりに「私の子ビューモデル」のみをターゲットにする良い方法はないようです。ネストされたビュー&vmが複数のビューにネストされた場合、1つのビューでボタンをクリックすると、他の複数のビューが誤って更新されるという状況に陥る可能性があります。 – CodingWithSpike

4

親ビューモデルが単に子ビューモデルへの参照を保持し、子ビューモデルが親ビューモデルへの参照を保持する最も明白な実装から始めなければなりません。コマンドが親ビューモデル上で実行されるとき、それは単にテキストボックスがバインドされている子ビューモデルに値を設定するだけです。

親子間の抽象レイヤー(イベントなど)を追加すると、複雑さが増し、その結果として正当化される必要があります。このインダイレクションが提供する値がコードの複雑さの増加よりも高い場合(たとえば、親のコマンドが実行されたときに何が起きるかがはっきりしない場合、子プロセスを取得せずに親イベントにサブスクライブする方法の問題を解決する必要があります。親と子の間の依存関係を追加することで、実際のロジックをすべての配管で汚染する追加のイベントを追加する必要があります)、確かにイベント(またはPropertyObserverなど)が次の論理ステップになる可能性があります。

+0

シンプルに始め、必要に応じて複雑さを導入する方が良いと私は同意します。異なるパターンやテクニックを覚えておくことは重要ですが、単純な実装で限界に遭遇した場合は、代替パターンに移行するための行動計画があります。私はそれに応じてコードをコメントする傾向があり、特定の設計上の意思決定がどこで行われ、変更されるかを明確にするのに役立ちます。 – jpierson

関連する問題

 関連する問題