在我的 WPF 应用程序中,我使用的是ViewModelLocator
无 IoC。我正在ViewModelLocator.Cleanup()
从我自己的按钮调用 MVVM-Light 框架提供的静态方法,该按钮与“关闭窗口命令”相关联。此命令调用 static ViewModelLocator.Cleanup()
,它调用我的 MainWindowViewModel 实例上的实例 Cleanup() 方法。然后,实例 Cleanup() 方法将 MainWindow 绑定到的属性设置DataContext
为 null。属性的 setter 引发了一个PropertyChanged
事件。奇怪的是,将此属性设置为 null 不会导致窗口关闭。
我试图理解为什么会这样?如果我将 MainWindow's 设置DataContext
为 null,那应该不一样Window.Close()
吗?就我而言,Window 及其所有元素都保留在屏幕上。但是,如果我尝试进一步的操作,我会得到空指针异常,表明DataContext
绑定属性确实已设置为空;这在调试器中也得到了证实。
我通过挂钩 Application.Exit 事件并在事件处理程序中发出 Window.Close() 创建了一种解决方法,以便创建我自己的“关闭窗口”按钮(即,为我自己的按钮/命令创建与单击相同的功能窗口右上角的 X 按钮)。由于直接从 MVVM 调用 UI 元素(即 Window 实例)对 MVVM 不友好,因此我使用ViewService来实现 Window.Close() 功能以保持变通方法 MVVM 友好。我是 ViewService 成语(或模式)的忠实拥护者,但我认为这里没有必要;除了,我可以看到退出应用程序是一种特殊情况,它可能应该与应用程序生命周期相关联,而.Net 似乎只允许通过发出 Window.Close() 方法来退出 WPF 应用程序。
想法赞赏。