RelayCommand RaiseCanExecuteChanged()失败

Jac*_*goń 3 c# silverlight mvvm relaycommand mvvm-light

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

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

...

DeleteCommand = new RelayCommand(Delete, CanDelete);
Run Code Online (Sandbox Code Playgroud)

BoolProp1并且BoolProp2是正确的属性,setter正确提升PropertyChanged,但众所周知,这还不足以使SL重新评估CanExecute命令.这就是为什么我也打电话给Delete.RaiseCanExecuteChanged()两个二传手.

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

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

任何提示?我已经在考虑使用额外的IsExecutable字段刷新INotifyPropertyChanged...

UPDATE

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

_canExecute是一个Func<bool>集一次传递给构造函数的值.

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

UPDATE

看我的回答.

Jac*_*goń 8

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

DeleteCommand = new RelayCommand(Delete, CanDelete);
Run Code Online (Sandbox Code Playgroud)

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

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