2011-07-09 8 views
2

私はメインウィンドウのデータコンテキストであるクラスAを持っています。 私はアプリケーションのウィンドウの1つのビューモデルであるクラスBを持っています。 クラス間の関係はありません。関連のないクラス間のイベント

イベントハンドラは、それはそうすることが可能ですクラスA

に位置している間、私は、クラスBでイベントを発生させるために何らかの形で必要

私がやっているものの例は次のとおりです。私はあなただけのクラスBの公共の場でイベントを作成し、添付する必要があるクラスBから助け

答えて

5

私の本では、pub/subのメッセンジャー/イベントアグリゲーターを見ているは​​ずです。 PRISMにはMVVM Lightツールキットのようなものが1つ付属していますが、Github-TinyMessengerから自分自身の "drop in cs file"を取得することもできます。

これにより、デカップリングされた通信が可能になります。パブリッシャとサブスクライバが共通するのは、アグリゲータとメッセージ形式だけです。クラスが無関係で、おそらく別々に構築されている場合は、それらをイベントと結合してはいけません。イベントを使用する場合、2つのクラスの存続期間が異なると予想される場合、イベントに登録することによるGCの影響を認識する必要があります。

ので、非常に簡単な例では、クラスAに、あなたはあなたがしたい「イベント」を発射したい時はいつでも、クラスB、に続いて

this.messenger.Subscribe<TitleChangeMessage>(m => <do some stuff>); 

ような何かをしたい:

this.messenger.Publish(new TitleChangedMessage("new title")); 
+1

MVVMパターンを適用すると、スティーブンは正しいです。できるだけ疎結合したいものを欲しがります - イベントアグリゲーターが道のりです... mvvmパターンを適用するほとんどのツールキットにはイベントアグリゲーションクラスがありますそれら –

+0

うん、私はメッセンジャーのパターンが大好きです。デカプリング! :) –

+0

マイクロソフトのパターンと実務チームのKarl Shifflettも、上記の人々の言葉で述べられているいくつかの概念を折り畳むことで、[Prism's Event Aggregatorに関するビデオ](http://www.vimeo.com/11585963) – Kendrick

1

ため

感謝をメインウィンドウのタイトルを変更するトリングていますクラスAからそれを委譲する。 例を示します。Bのコンストラクタはバックグラウンドタスクを開始し、2秒間待ってイベントを発生させます。 Aのコンストラクタは、B型のオブジェクトbを作成し、そのデリゲートをbのイベントに関連付けます。メイン関数では、クラスAのオブジェクトが作成され、スレッドが5秒間スリープ状態になります。その時間が過ぎる前に、その出来事は既に発射され処理されています。

class A 
    { 
     private B b; 

     public A() 
     { 
      b = new B(); 
      b.MyEvent += MyHandler; 
     } 

     public void MyHandler(string s) 
     { 
     } 

     public static void Main(string[] args) 
     { 
      A a = new A(); 

      Thread.Sleep(5000); 
     } 
    } 

    class B 
    { 
     public B() 
     { 
      Task.Factory.StartNew(() => 
      { 
       Thread.Sleep(2000); 
       MyEvent(""); 
      }); 
     } 

     public delegate void MyDelegate(string s); 
     public event MyDelegate MyEvent; 
    } 
+1

これは機能しますが、OPはクラス間に関係がないと述べました。つまり、AはBを知ってはならず、その逆もありません。このソリューションは、クラス間の依存関係を作成します。 –

+1

しかし、明らかにクラス間の関係があります。 AはBがイベントを起こすとき何かをする必要がある。あなたはその関係を隠そうと半分に曲げることができますが、それはまだ存在します。 –

関連する問題