2011-01-10 76 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事件處理程序)。