gpt4 book ai didi

c# - RelayCommand RaiseCanExecuteChanged() 失败

转载 作者:行者123 更新时间:2023-11-30 14:02:04 31 4
gpt4 key购买 nike

我正在使用几个绑定(bind)到 RelayCommands 的 Buttons,这些 RelayCommands 是用 CanExecute 委托(delegate)初始化的。

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

...

DeleteCommand = new RelayCommand(Delete, CanDelete);

BoolProp1BoolProp2是 setter 正确提升的常规属性 PropertyChanged ,但众所周知,这还不足以让SL重新评估CanExecute在命令上。这就是为什么我也调用 Delete.RaiseCanExecuteChanged()在两个二传手中。

所有这些工作正常(按钮被禁用和正确启用)直到某个点,所有停止的地方。那时,调用Delete.RaiseCanExecuteChanged()不再触发我在 CanDelete() 中的断点和按钮永远保持原样。

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

有什么提示吗?我已经在考虑使用额外的 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>设置一次传递给构造函数的值。

我仍在努力以最低限度地重现该问题。

更新

看我的回答。

最佳答案

佩贝克。我的框架在某些情况下运行了代码

DeleteCommand = new RelayCommand(Delete, CanDelete);

不止一次,用新实例覆盖实际绑定(bind)到 View 的命令。

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

关于c# - RelayCommand RaiseCanExecuteChanged() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6933427/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com