【问题标题】:AsyncCommand CanExecute handlerAsyncCommand CanExecute 处理程序
【发布时间】:2016-11-30 11:47:17
【问题描述】:

我在 WPF (.NET 4.0) 中使用@Stephen-Cleary AsyncCommand implementation,现在我正在尝试找出如何在命令定义期间指定 CanExecute 处理程序。

通常我会这样创建命令:

            SaveCommandAsync = AsyncCommand.Create(async token =>
            {
                //async code    
            });

我没有看到任何 Create 重载,因此我可以指定 CanExecute 逻辑。

谢谢,

伊戈尔

【问题讨论】:

  • 发布一个链接到提到的实现。
  • 这是一个非常流行的异步命令实现(问题上的链接),在网络上有很多参考资料,但我找不到任何示例或如何指定 CanExecute 行为。
  • 我认为那篇文章的来源具有教育目的,它是为了展示方法,而不是在现实生活中的应用程序中“按原样”使用。相反,我建议查看his library on github。如果你真的想保留那个实现,你可以尝试继承 AsyncCommand 并覆盖 CanExecute。
  • 我正在使用 GitHub,谢谢(但不是 .net 核心版本),因为我的目标是 .NET 4.0。问题是 CanExecute 逻辑取决于每个命令,所以我需要一个谓词,类似于 RelayCommand。有什么想法吗?

标签: .net wpf asynchronous icommand


【解决方案1】:

使用 Stephen Cleary 的 Nito.Mvvm.Async 项目来实现您的需要。

添加对package的nuget引用: <package id="Nito.Mvvm.Async" version="1.0.0-eta-05" targetFramework="net45" />

创建 Xaml 绑定:

<Button Content="Toggle" Command="{Binding MyAsyncCommand}"></Button>

创建CustomAsyncCommand,指定CanExecute函数

MyAsyncCommand = new CustomAsyncCommand(AsyncAction, x=> !_isWorking);

在 AsyncAction 中做一些异步工作

private async Task AsyncAction(object obj) {
    _isWorking = true;
    MyAsyncCommand.OnCanExecuteChanged();
    await Task.Delay(2000);
    _isWorking = false;
    MyAsyncCommand.OnCanExecuteChanged();
}

最后:enjoy。

【讨论】:

  • 不幸的是,我的目标是 .NET 4.0
  • 您指出的来源是使用await,就像在AsyncCommandBase 中一样,还有像await ExecuteAsync(parameter); 这样的用法。 await 关键字在 .NET 4.0 中不可用,那么您如何设法编译该代码?
  • 好问题。几个月前,我不得不从 .NET 4.5 降级到 4.0,所以我被 Microsoft.Bcl.Async NuGet 包救了。
  • 好吧,我刚刚尝试将 Stephen Cleary 库中的所有源代码组合起来,并在 .net 4.0 下编译它们。好吧,这并不容易,await 运算符、WeakReference<T> 和Environment.ManagedThreadId 有一些用法。但是它们都可以很容易地移植到 4.0。我还没有完成测试(现在必须运行),但这听起来对你来说是一个可以接受的解决方案吗?
  • 当然对我有用,也许对其他人有用!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-20
  • 1970-01-01
  • 2015-09-13
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
相关资源
最近更新 更多