2012-09-05 88 views
3

目前,我已經實現了,我可以直接訪問我想要訂閱的類,但是如果我有一個我沒有直接訪問的類,會發生什麼?即X觸發的事件,Y訂閱它。沒有使用靜態事件可以這樣做嗎?就好像你有兩個窗口,一個發生在一個窗口上,而你希望在第二個窗口上觸發它。是否可以間接訂閱事件?

例子:

Y (listens for event and DoSomething()) ---. 
              |----Event 
X (triggers event when something changes) -' 

當前代碼:

public static class MyEvents { 
    public delegate void FirstEventHandler(); 
} 

public partial class MainWindow : Window { 
    public MainWindow() { 
     InitializeComponent(); 

     SecondaryWindow secondWindow = new SecondaryWindow(); 
     secondWindow.Show(); 

     secondWindow.secondaryWindowEvent += new MyEvents.FirstEventHandler(callEvent); 
    } 

    protected void callEvent() { 
     MessageBox.Show("This is a MessageBox."); 
    } 
} 
+0

你的意思是你沒有直接訪問的課程? –

+0

@lc .:可能他沒有提及A類中的B類實例,但他們需要一些通信手段。這在MVVM類型的用戶界面中發生了很多。有一種方法可以通過弱事件引用來處理它(靜態事件有點邪惡,因爲它們會引起GC中的混亂) –

+0

@lc。我的意思是,一個不是在第一個內部創建的類,就像在上面的在MainWindow中創建secondWindow的類中一樣。我希望能夠將該事件作爲一個單獨的屬性。 –

回答

4

所以,我有一個WPF UI我曾在短期內解決這個問題。由於很多原因,UI的不同部分是分開的,但在實際應用中,他們經常需要彼此通信,並且傳遞參考是次優的。

我在我的應用程序中使用了Event Aggregator類。它允許邏輯上分離的組件保持鬆散耦合,但仍然能夠通過事件相互通信。這種方法爲您節省了與靜態事件相關的頭痛(靜態事件必須在對象超出範圍之前取消訂閱,否則所述對象將不符合垃圾回收的條件)。

+0

你有沒有可以分享的例子?我試圖找到一個我可以學習和調試的基本清理示例,而不必具有所有複雜性。 –

+0

有沒有更簡單的Event Aggregator實現?把所有這些不同的方法包裝起來相當複雜。我在Codeplex上找到了一個[事件聚合器庫](http://eventaggregator.codeplex.com/),我只需指定我想使用的ID和方法,但它並不完全告訴我事情是怎麼樣的實際完成。 –