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

标签 c# wpf multithreading mvvm burn

在基于MVVM的WPF应用程序的viewModel中,我有两个命令来处理两种不同状态下的两次不同的“取消”单击。

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

  • 这两个命令都具有canExecute属性,它们可以根据两个状态相应地解析。

    我创建了一个新方法(在同一viewModel中),该方法封装了这两个命令。现在,当单击全局“X”关闭按钮时,我需要调用此方法。我尝试了以下方法:
    Closing += (sender, e) => viewModel.CloseWindowCommand();
    

    这导致了未处理的异常:

    无法在窗口关闭时将“可见性”设置为“可见”或调用Show,ShowDialog,Close或WindowInteropHelper.EnsureHandle。

    调用堆栈为:
    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)
    

    我究竟做错了什么?

    我看过一些相关的问题和帖子(herehere),但是到目前为止,我一直无法找到问题所在。

    任何指针表示赞赏。

    最佳答案

    看来您要关闭的窗口上调用Close()。显然,您不应该这样做。也许您可以使用viewModel.CloseWindowCommand中的某个参数来暗示该窗口已经关闭。

    关于c# - 从全局X关闭按钮调用viewModel中定义的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16686688/

    相关文章:

    C# 传递可变数量的引用参数

    c# - 什么时候应该使用 Partial 关键字?

    c# - 编辑后未清除 WPF Datagrid 行验证错误

    Java wait() 和 notify() 无法正常工作

    android - 需要一个示例来说明如何执行异步 HTTP 请求

    java - 如果所有线程都空闲则停止工作

    c# - 如何设置 SQL Server 表中的最大行数?

    c# - C# .NET 4.5 中的 JavaScript 解析器和分析器

    WPF 在同一个 ListCollectionView 上使用多个过滤器

    c# - 向后播放动画( Storyboard)