我正在使用几个绑定到使用 CanExecute 委托初始化的 RelayCommands 的按钮。
RelayCommand DeleteCommand;
bool CanDelete()
{
return BoolProp1 && BoolProp2;
}
...
DeleteCommand = new RelayCommand(Delete, CanDelete);
BoolProp1
并且BoolProp2
是 setter 正确 raise 的常规属性PropertyChanged
,但众所周知,这不足以让 SL 重新评估CanExecute
命令。这就是为什么我也叫Delete.RaiseCanExecuteChanged()
两个二传手。
所有这些都可以正常工作(按钮被禁用和正确启用)直到某个时候,所有这些都停止了。那时,调用Delete.RaiseCanExecuteChanged()
不再触发我的断点CanDelete()
,按钮永远保持原样。
我花了 2 个小时试图找出没有效果的确切原因。我怀疑RaiseCanExecuteChanged()
在单个“绑定迭代”期间多次调用会以某种方式破坏机制。
有什么提示吗?我已经在考虑使用通过...IsExecutable
刷新的附加字段INotifyPropertyChanged
更新
RelayCommand
实际上GalaSoft.MvvmLight.Command.RelayCommand
来自MVVM Light Toolkit。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>
我仍在努力尽量减少重现该问题。
更新
看我的回答。