Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理ViewModels和CanExecute处理程序_C#_Wpf - Fatal编程技术网

C# 处理ViewModels和CanExecute处理程序

C# 处理ViewModels和CanExecute处理程序,c#,wpf,C#,Wpf,我最近遇到了一个异常,因为在屏幕关闭后调用了命令的CanExecute 通过在方法中添加额外的检查,可以很容易地解决这个问题,但现在我担心如果viewmodels没有被正确处理,应用程序的生命周期性能会有问题 我通过将命令作为属性存储在ViewModel中来连接命令,然后在xaml中绑定它们 那么,有人知道为什么关闭的窗口会继续调用CanExecute方法吗?视图模型中可能仍然有命令处理程序或属性更改处理程序处于活动状态。因此,视图模型仍然存在,因此canexecute仍在执行。您可能已订阅Co

我最近遇到了一个异常,因为在屏幕关闭后调用了命令的CanExecute

通过在方法中添加额外的检查,可以很容易地解决这个问题,但现在我担心如果viewmodels没有被正确处理,应用程序的生命周期性能会有问题

我通过将命令作为属性存储在ViewModel中来连接命令,然后在xaml中绑定它们


那么,有人知道为什么关闭的窗口会继续调用CanExecute方法吗?

视图模型中可能仍然有命令处理程序或属性更改处理程序处于活动状态。因此,视图模型仍然存在,因此canexecute仍在执行。您可能已订阅CommandManager.RequerySuggest以更新您的命令。此事件将在所有更新中调用,而不仅仅是在为其创建视图模型的窗口中


您应该或可以做的是订阅关闭的窗口或卸载的usercontrol事件,以将视图模型的IsClosed状态设置为false,然后删除或禁用这些命令,您必须在RelayCommand中实现此功能。

发生这种情况的原因是CommandManager不知道在处理程序被垃圾回收之前是否应该停止触发CanExecute

我也遇到了同样的问题,我在关闭窗口后将窗口的DataContext设置为null,从而解决了这个问题。如果命令绑定到ViewModel,则可以正常工作。删除DataContext会注销canExecute事件处理程序。

可能对您有用。