从全局X关闭按钮调用viewModel中定义的方法
本文关键字:定义 方法 viewModel 调用 全局 关闭按钮 | 更新日期: 2023-09-27 18:14:41
在我的基于MVVM的WPF应用程序的viewModel中,我有两个命令来处理两个不同的Cancel单击,在两个不同的状态。
- 当没有正在进行的操作进度时,它继电器
view.close()
方法。 - 当进度正在进行时-它将
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)
我做错了什么?
我已经看了一些相关的问题和帖子(这里,这里),但到目前为止我还无法找到问题所在。
似乎您在即将关闭的窗口上调用Close()。显然,你不应该这么做。也许你可以在viewModel.CloseWindowCommand
中使用一些参数提示窗口已经关闭。