我正在使用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?
答案 0 :(得分:0)
您可以取出CommandManager.RequerySuggested
并使用MVVM Light's RelayCommand implementation。注意:这要求您在希望更新CanExecute的任何时候显式调用RaiseCanExecuteChanged()
。