首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RelayCommand RaiseCanExecuteChanged()失败

RelayCommand RaiseCanExecuteChanged()失败
EN

Stack Overflow用户
提问于 2011-08-03 21:18:22
回答 2查看 6.6K关注 0票数 4

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

代码语言:javascript
复制
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轻型工具包GalaSoft.MvvmLight.Command.RelayCommand。ILSpy展示了一个非常简单的ICommand实现:

代码语言:javascript
复制
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>,将其设置为传递给构造函数的值一次。

我仍在尽量少地重复这个问题。

更新

看看我的答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-03 22:01:32

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

代码语言:javascript
复制
DeleteCommand = new RelayCommand(Delete, CanDelete);

然后,重写实际上被绑定到使用新实例查看的命令。

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

票数 8
EN

Stack Overflow用户

发布于 2021-10-11 15:14:02

对于其他面临同样问题和接受答案的人来说,这对我没有任何帮助(对于我自己的记录来说,就像我今天花了几个小时在这上面一样)。

如果在VSTO外接程序中使用MVVM,请确保Office应用程序有机会处理自己的消息以使其工作。例如,在我的例子中,我让我的丝带按钮监听底层VM的命令对象的CanExecuteChanged,不管我做了什么,它都不会触发。花了几个小时之后,我意识到我必须让Office应用程序喘口气,处理传入的消息,这样才能让CanExecuteChanged被外接程序捕获。然后我所做的就是将我的RaiseCanExecuteChanged函数交给DispatcherHelper,让它异步地触发。直到那时,我的丝带按钮才开始对CanExecuteChanged事件做出反应。就像这样:

代码语言:javascript
复制
DispatcherHelper.CheckBeginInvokeOnUI(() =>
{
  doc.Activate();
  ResetVariablesCommand.RaiseCanExecuteChanged();
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6933427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档