我使用绑定到使用CanExecute委托初始化的RelayCommands的几个按钮。
RelayCommand DeleteCommand;
bool CanDelete()
{
return BoolProp1 && BoolProp2;
}
...
DeleteCommand = new RelayCommand(Delete, CanDelete);
BoolProp1
和BoolProp2
是常规属性,其中setter正确地引发PropertyChanged
,但众所周知,这还不足以使SL重新评估CanExecute
命令。这就是为什么我也会在两个制定者中调用Delete.RaiseCanExecuteChanged()
。
所有这些工作正常(按钮被禁用并正确启用)到某一点,所有停止。此时,调用Delete.RaiseCanExecuteChanged()
不再触发CanDelete()
中的断点,按钮永远保持原样。
我花了2个小时试图找出确切原因而没有效果。我怀疑在单个“绑定迭代”期间多次RaiseCanExecuteChanged()
调用会以某种方式破坏机制。
任何提示?我已经在考虑使用通过IsExecutable
...
INotifyPropertyChanged
字段了
更新
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>
。
我仍在努力尽量少复制这个问题。
更新
请参阅我的回答。
答案 0 :(得分:7)
PEBKAC。在某些情况下我的框架运行代码
DeleteCommand = new RelayCommand(Delete, CanDelete);
多一次,覆盖实际绑定到新实例的命令。
如果有人遇到此问题 - 请确保您在视图绑定的同一实例上调用RelayCommand.RaiseCanExecuteChanged()
。