加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – RelayCommand RaiseCanExecuteChanged()失败

发布时间:2020-12-16 01:46:18 所属栏目:百科 来源:网络整理
导读:我使用绑定到使用CanExecute委托初始化的RelayCommands的几个按钮. RelayCommand DeleteCommand;bool CanDelete(){ return BoolProp1 BoolProp2;}...DeleteCommand = new RelayCommand(Delete,CanDelete); BoolProp1和BoolProp2是常规属性,其中setter正确引
我使用绑定到使用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().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读