2011-01-10 78 views
2

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

这很容易通过增加一个额外的检查方法来解决,但现在我担心我的应用程序的生命周期性能,如果viewmodels没有被正确处置。

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

所以没有人知道为什么关闭的窗口会继续拨打CanExecute()方法?

+0

http://social.msdn.microsoft.com/Forums/en/wpf/thread/43fc6beb-0733-424a-a915-0e03b4ce2ae0可能对您有用。 – Gqqnbig 2013-02-02 10:59:31

回答

2

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

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

2

发生这种情况的原因是CommandManager不知道它应该停止发射CanExecute,直到处理程序被垃圾收集为止。

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