匿名代表关闭窗口

时间:2014-03-19 14:01:19

标签: c# wpf mvvm delegates

所以我有一个可以通过按下按钮启动的窗口。用户可以多次按此按钮以在该窗口中获得不同的结果(刷新结果)。我正在使用匿名委托处理窗口关闭,并将视图设置为null,以便可以再次创建它。如果我不这样做,窗口会被丢弃,但它仍然会挂起,因此我无法在已经退出的窗口上调用Show()。这是我的代码:

if (ResultsView == null) { ResultsView = new View.ResultsView(); }
//set the data context
ResultsView.DataContext = vm;

//this will close the window properly, so it can be recreated if needed.
EventHandler handler = null;
handler = delegate
{
    ResultsView.Closed -= handler;
    ResultsView = null;
};
ResultsView.Closed += handler;

//if the view is not loaded show it.
if (!ResultsView.IsLoaded)
{
     ResultsView.Owner = Application.Current.MainWindow;
     ResultsView.Show();
}

这样可以正常工作,除非结果窗口打开并且用户再次单击该按钮以刷新结果视图。如果发生这种情况,当窗口关闭时,由于某种原因,处理程序现在为null,并且我尝试取消订阅已关闭的事件时出现null异常。当我走过代码时,处理程序似乎不是null

1 个答案:

答案 0 :(得分:3)

您只想在创建新窗口时附加新处理程序。拥有声明处理程序的所有代码,直到您添加包含在创建新窗口的if正文中的处理程序。

如果您不这样做,则需要将处理程序重新添加到现有窗口。你不想这样做。