从全局X关闭按钮调用viewModel中定义的方法

本文关键字:定义 方法 viewModel 调用 全局 关闭按钮 | 更新日期: 2023-09-27 18:14:41

在我的基于MVVM的WPF应用程序的viewModel中,我有两个命令来处理两个不同的Cancel单击,在两个不同的状态。

  1. 当没有正在进行的操作进度时,它继电器view.close()方法。
  2. 当进度正在进行时-它将cancelWaiting = true传递给进度回调,然后相应地暂停进度,同时弹出取消确认消息框,并根据是/否取消或继续。

这两个命令都有canExecute属性,根据两种状态相应地解析。

我创建了一个封装这两个命令的新方法(在同一个viewModel中)。现在,我需要在全局的"X"关闭按钮被单击时调用这个方法。我尝试了以下操作:

Closing += (sender, e) => viewModel.CloseWindowCommand();

这导致了一个未处理的异常:

不能设置可见度为可见或调用Show, ShowDialog, Close,或windowstophelper。在窗口关闭时确保句柄。

,调用堆栈为:

at System.Windows.Window.VerifyNotClosing()
   at System.Windows.Window.InternalClose(Boolean shutdown, Boolean ignoreCancel)
   at System.Windows.Window.Close()
   at Myapp.ViewModel.RootViewModel.<get_CloseCommand>b__0()
   at Myapp.RelayCommand.Execute(Object parameter)
   at Myapp.ViewModel.RootViewModel.CloseWindowCommand()
   at Myapp.View.RootView.WindowClose(Object sender, CancelEventArgs e)
   at System.Windows.Window.OnClosing(CancelEventArgs e)
   at System.Windows.Window.WmClose()
   at System.Windows.Window.WindowFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.PublicHooksFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)

我做错了什么?

我已经看了一些相关的问题和帖子(这里,这里),但到目前为止我还无法找到问题所在。

从全局X关闭按钮调用viewModel中定义的方法

似乎您在即将关闭的窗口上调用Close()。显然,你不应该这么做。也许你可以在viewModel.CloseWindowCommand中使用一些参数提示窗口已经关闭。