2012-09-05 89 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和方法,但它并不完全告诉我事情是怎么样的实际完成。 –