c# – RelayCommand RaiseCanExecuteChanged()失败
我使用绑定到使用CanExecute委托初始化的RelayCommands的几个按钮.
RelayCommand DeleteCommand; bool CanDelete() { return BoolProp1 && BoolProp2; } ... DeleteCommand = new RelayCommand(Delete,CanDelete); BoolProp1和BoolProp2是常规属性,其中setter正确引发了PropertyChanged,但众所周知,这还不足以使SL在命令上重新评估CanExecute.这就是为什么我也在两个setter中调用Delete.RaiseCanExecuteChanged(). 所有这些工作正常(按钮被禁用并正确启用)到某一点,所有停止.此时,调用Delete.RaiseCanExecuteChanged()不再触发CanDelete()中的断点,按钮永远保持原样. 我花了2个小时试图找出确切原因而没有效果.我怀疑在单个“绑定迭代”期间多次调用RaiseCanExecuteChanged()会以某种方式破坏机制. 任何提示?我已经在考虑使用通过INotifyPropertyChanged刷新的额外IsExecutable字段… UPDATE RelayCommand实际上是来自MVVM Light Toolkit的GalaSoft.MvvmLight.Command.RelayCommand.ILSpy显示了一个非常简单的ICommand实现: public bool CanExecute(object parameter) { return this._canExecute == null || this._canExecute.Invoke(); } public void RaiseCanExecuteChanged() { EventHandler canExecuteChanged = this.CanExecuteChanged; if (canExecuteChanged != null) { canExecuteChanged.Invoke(this,EventArgs.Empty); } } _canExecute是一个Func< bool>设置一次为传递给构造函数的值. 我仍在努力尽量少复制这个问题. UPDATE 看我的回答. 解决方法
PEBKAC.在某些情况下我的框架运行代码
DeleteCommand = new RelayCommand(Delete,CanDelete); 多一次,覆盖实际绑定到新实例查看的命令. 如果有人遇到此问题 – 请确保在视图绑定的同一实例上调用RelayCommand.RaiseCanExecuteChanged(). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |