0

我有两个窗口:一个窗口和一个通过双击主窗口数据网格中的特定行打开的详细信息窗口。保存详细信息窗口中的数据时,我想刷新主窗口的数据网格控件。

(一些不相关的细节:每个窗口都继承自一个BaseWindow类,并且有一个继承自 EF5 的类的自己的副本DbContext。我已向Save部分类添加了一个事件,并在调用时重写SaveChanges以引发此事件SaveChanges。这实际上是事件我正在附加一个事件处理程序。)

我知道我可以通过将事件处理程序附加到事件来做到这一点Save。但是,我不知道关闭窗口的顺序 - 如果先关闭主窗口,则详细信息窗口的实例仍然会引用它。

如果我监听Closing'/'Closed主窗口的事件,以便知道何时释放附加到“保存”事件的处理程序,我将遇到同样的问题——即使在详细信息窗口关闭。

我知道我可以按照这里WeakEventManager的描述实现 a ,但我想知道是否有更简单的技术可以使用。(有人告诉我我有把事情复杂化的倾向。)

(我没有使用 MVVM。)

4

1 回答 1

0

WeakEventManager可以完成这项工作,只需使用通用版本,并没有什么复杂的。在您的情况下,性能方面应该非常好。

如您所说,另一种选择是Closing从主窗口取消订阅主窗口的事件处理程序。

要在详细信息窗口关闭时删除所有引用,请在详细信息窗口关闭时取消订阅详细信息窗口内的所有事件处理程序,方法是将此方法订阅到Closing事件:

public OnClosing()
{       
    Delegate[] registeredDelegates = saveHandler.GetInvocationList();
    foreach (Delegate d in registeredDelegates )
       saveHandler-= (d as SaveDelegate);
}

其中 saveHandler 是您的处理程序,而 SaveDelegate 是您的自定义委托类型。

话虽如此,如果您想摆脱过于复杂的形象,请不要在意...

于 2013-04-08T08:59:40.300 回答