c# - 匿名委托(delegate)关闭窗口

标签 c# wpf mvvm delegates

所以我有一个可以通过按下按钮启动的窗口。用户可以多次按下此按钮以在该窗口中获得不同的结果(刷新结果)。我使用匿名委托(delegate)来处理窗口的关闭,并将 View 设置为 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();
}

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

最佳答案

您只想在创建新窗口时附加一个新的处理程序。拥有声明处理程序的所有代码,直到您将处理程序添加到您创建新窗口的 if 主体中。

如果不这样做,您将再次添加处理程序到现有窗口。你不想那样做。

关于c# - 匿名委托(delegate)关闭窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22508278/

相关文章:

c# - 有没有办法区分 myFunc(1, 2, 3) 和 myFunc(new int[] { 1, 2, 3 })?

c# - 为 Windbg 获取正确的 .net native 符号

c# - using语句中的异步方法

c# - 如何避免 RowDefinition 重复?

wpf - 在 WPF 中取消 BeginInvoke

wpf - 如何使用EventAggregator和Microsoft Prism库从预订的方法返回数据

MVVM 子属性变化检测

c# sharpziplib 将文件添加到现有存档

ios - MVVM 通用网络架构

ios - Swift语言的StructName.init是什么意思?