2009-09-18 5 views
5

WinFormsでMVPを使用しようとしていますが、子ビュー間の調整をうまく処理する方法が混乱しています。子ビューの調整は、MVPでどのように最適に処理されますか?

たとえば、2つの子ビューを持つ親ビューがあります。 1つの子ビューのイベントは、2つ目の子ビューによって実行される必要があります。

親ビューでこれを直接制御する必要がありますか?私はMVPのパターンをバイパスしているようです。

または、子ビューがコンストラクタパラメータとして互いに関係する必要がありますか?その場合、最初の子ビューでイベントが発生すると、2番目の子ビューはそのイベントを受信して​​、プレゼンターに何かが発生したことを通知します。それから、発表者は、第2子ビューに何をすべきかを伝えるために、第1子ビュー(それについては知らない)からデータを取得する必要があります。私は何かを逃しているように感じるので、それは回旋しているようです。ここで

は事態のためのいくつかの擬似コードです:コンストラクタで他の子ビューを撮影

public class ParentView : UserControl, IParentView 
{ 
    private ChildViewOne childViewOne; 
    private ChildViewTwo childViewTwo; 
    private ParentViewPresenter presenter; 

    private RegisterEvents() 
    { 
     childViewOne.EventOccured += new EventHandler(HandleEvent); 
    } 

    private void HandleEvent() 
    { 
     childViewTwo.DoSomething(); 
    } 
} 
+0

"1つの子ビューのイベントは、2番目の子ビューでアクションを実行する必要があります。"何が起こるのか? – SwDevMan81

+0

たとえば、childViewOneがタイムラインで、childViewTwoがビデオであるとします。タイムラインはTimeChangedイベントを公開し、ビデオの現在のフレームを変更することによってビデオはそのイベントに応答する必要があります。 – jameswelle

答えて

0

Event Aggregator patternをご覧ください。それはあなたがすべての疎結合を保つことを可能にします。 Prismには1つしか付属しておらず、Prismフレームワーク/ライブラリ全体を購入することなく、使いやすいです。

あなたのコードは次のようになります。

public class ChildViewOne { 
    private IEventAggregator evtAggregator; 

    public ChildViewOne(IEventAggregator evtAggregator) { 
     this.evtAggregator = evtAggregator; 
    } 

    private void OnEventOccured(){ 
     evtAggregator.GetEvent<EventOccured>().Publish(); 
    } 
} 

publish class ChildViewTwo { 
    private IEventAggregator evtAggregator; 

    public ChildViewTwo(IEventAggregator evtAggregator) { 
    evtAggregator.GetEvent<EventOccured>().Subscribe(OnEventOccured); 
    } 

    private void OnEventOccured() { 
     // Do something here... 
    } 
} 

EDIT:ブライアン・ノイスは、WinFormsのにプリズムイベントアグリゲータを移植しました。それを確認してくださいhere, on his blog

0

は悪いアイデアのように思えます。将来他の子ビューを追加する必要がある場合はどうしますか?

子ビューを親ビューでルーティングする方がよいでしょう。親ビューでイベントをルーティングする場合、どのようにMVPに違反していますか?

+0

私は現在やっているような意味ですか、ParentViewがその子どものすべてのイベントの組合を公開し、イベントを発表者に渡したばかりですか? – jameswelle

0

IChildViewインターフェイスのプロパティをSiblingView(またはあなたのアプリケーションのビジネスコンテキストを考えれば適切なもの)という名前で作成します。コンストラクタのparamとして追加する必要はありませんが、InterfaceにはSetSiblingView()というメソッドがあります。あなたはコンストラクタからそれを呼び出すことができます。その後、イベントOnSiblingEventFired()を持つことができます。

これは私にはあまり畳み込まれていないようですが、これは一般的に私が過去にこのタイプの問題にどのように近づいてきたからです。

しかし、親コントロールを持つディテールがあまりにも分かりませんが、MVCパターンに従っていないようです。

関連する問題