处置ViewModels& CanExecute处理程序

时间:2011-01-10 09:45:45

标签: c# wpf

我最近有一个例外,因为在屏幕关闭后调用了CanExecute()命令。

通过在方法中添加额外的检查可以很容易地修复它,但是如果视图模型没有被正确处理,我现在关心应用程序的生命周期性能。

我通过将命令存储为ViewModel中的属性来挂钩命令,然后在xaml中绑定它们。

所以有人知道为什么关闭的窗口会继续调用CanExecute()方法吗?

2 个答案:

答案 0 :(得分:2)

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

您应该(或可以)做的是订阅Closed(窗口)或Unloaded(usercontrol)事件以将视图模型的IsClosed状态设置为false,然后删除命令或禁用它们(您将不得不在RelayCommand中实现此功能。

答案 1 :(得分:2)

发生这种情况的原因是CommandManager没有线索它应该停止触发CanExecute,直到处理程序被垃圾收集。

我有同样的问题,我已经通过在关闭窗口后将窗口的DataContext设置为null来解决它。假设命令绑定到ViewModel(删除他的DataContext注销canExecute事件处理程序),它工作正常。