如何或何时清理WPF / MVVM中的RelayCommand对象?

时间:2011-08-24 17:23:18

标签: wpf mvvm relaycommand

我正在使用RelayCommand的标准Josh Smith实现在我的WPF / MVVM应用程序中实现ICommands。请参阅:WPF Apps with the MVVM Design Pattern

我的一些CanExecute方法需要很长时间才能运行。单独来说,它们并不坏(每个都只有几分之一秒)。但是我注意到我绑定到UI的命令越多,应用程序响应的速度就越慢(延迟超过10秒 - yuck)。

我认为这是因为RelayCommand CanExecuteChanged挂钩到CommandManager.RequerySuggested事件,我的ViewModel模板调用CommandManager.InvalidateRequerySuggested()作为IDataErrorInfo验证的一部分。

我的ViewModel实现了IDisposable,所以我试图利用OnDispose方法来清理我的RelayCommands,但是即使我的VM被处理掉后,ICommand.CanExecute方法也会继续被调用。

这导致我得出结论(CommandManager?,View?)持有对RelayCommand的引用。

有没有人有一个好的模式来释放和处理RelayCommands,以防止它们在所需的生命周期到期后被重新获得?

是否有更好的方法来管理何时应该调用CanExecute?

1 个答案:

答案 0 :(得分:0)

您可以取出CommandManager.RequerySuggested并使用MVVM Light's RelayCommand implementation。注意:这要求您在希望更新CanExecute的任何时候显式调用RaiseCanExecuteChanged()