RelayCommand RaiseCanExecuteChanged()失败

时间:2011-08-03 21:18:23

标签: c# silverlight mvvm mvvm-light relaycommand

我使用绑定到使用CanExecute委托初始化的RelayCommands的几个按钮。

RelayCommand DeleteCommand;
bool CanDelete()
{
    return BoolProp1 && BoolProp2;
}

...

DeleteCommand = new RelayCommand(Delete, CanDelete);

BoolProp1BoolProp2是常规属性,其中setter正确地引发PropertyChanged,但众所周知,这还不足以使SL重新评估CanExecute命令。这就是为什么我也会在两个制定者中调用Delete.RaiseCanExecuteChanged()

所有这些工作正常(按钮被禁用并正确启用)到某一点,所有停止。此时,调用Delete.RaiseCanExecuteChanged()不再触发CanDelete()中的断点,按钮永远保持原样。

我花了2个小时试图找出确切原因而没有效果。我怀疑在单个“绑定迭代”期间多次RaiseCanExecuteChanged()调用会以某种方式破坏机制。

任何提示?我已经在考虑使用通过IsExecutable ...

刷新的其他INotifyPropertyChanged字段了

更新

RelayCommand实际上是来自MVVM Light ToolkitGalaSoft.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>

我仍在努力尽量少复制这个问题。

更新

请参阅我的回答。

1 个答案:

答案 0 :(得分:7)

PEBKAC。在某些情况下我的框架运行代码

DeleteCommand = new RelayCommand(Delete, CanDelete);

多一次,覆盖实际绑定到新实例的命令。

如果有人遇到此问题 - 请确保您在视图绑定的同一实例上调用RelayCommand.RaiseCanExecuteChanged()