首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步ICommand实现

异步ICommand实现
EN

Stack Overflow用户
提问于 2017-03-10 15:38:49
回答 1查看 8K关注 0票数 8

我的asny ICommand实现遇到了一个奇怪的行为,当我试图在默认情况下禁用该命令时(即使没有向它传递CanExecute谓词)。

代码语言:javascript
复制
public bool CanExecute(object parameter)
{
  if (CanExecutePredicate == null)
  {
    return !mIsExecuting;
  }

  return !mIsExecuting && CanExecutePredicate(parameter);
}

public async void Execute(object parameter)
{
  mIsExecuting = true;
  await ExecuteAsync(parameter);
  mIsExecuting = false;
}

我尝试引入一个私有bool,在执行之前设置为true,执行后设置为false。当执行完成时,布尔会被设置,但只有在我单击鼠标按钮或移动鼠标或w/e之后,才会调用CanExecute。

现在我试着给你打电话

代码语言:javascript
复制
CanExecute(null);

之后

代码语言:javascript
复制
mIsExecuting = false;

但这也无济于事。我不知道我错过了什么。

谢谢你的帮忙

编辑:

为了清楚起见,我也为这个类添加了构造函数:

代码语言:javascript
复制
 public AsyncRelayCommand(Func<object, Task> execute)
  : this(execute, null)
{
}

public AsyncRelayCommand(Func<object, Task> asyncExecute,
               Predicate<object> canExecutePredicate)
{
  AsyncExecute = asyncExecute;
  CanExecutePredicate = canExecutePredicate;
}

protected virtual async Task ExecuteAsync(object parameter)
{
  await AsyncExecute(parameter);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-10 16:08:59

在异步场景中,WPF往往不知道何时检查命令,这就是为什么在I命令接口中有"CanExecuteChanged“事件的原因。

在您的命令实现中应该有类似这样的东西:

代码语言:javascript
复制
public event EventHandler CanExecuteChanged
{
    add { CommandManager.RequerySuggested += value; }

    remove { CommandManager.RequerySuggested -= value; }
}

public void RaiseCanExecuteChanged()
{
    CommandManager.InvalidateRequerySuggested();
}

使用上面的代码,您现在可以执行以下操作:

代码语言:javascript
复制
public async void Execute(object parameter)
{
    mIsExecuting = true;

    RaiseCanExecuteChanged ( ); // Not necessary if Execute is not called locally

    await ExecuteAsync(parameter);
    mIsExecuting = false;

    RaiseCanExecuteChanged ( );
}

这将告诉WPF您想要刷新命令的CanExecute状态。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42712848

复制
相关文章

相似问题

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