【问题标题】:How can I pass CommandParameter into AsyncCommand?如何将 CommandParameter 传递给 AsyncCommand?
【发布时间】:2022-01-26 11:06:36
【问题描述】:

我想异步运行按钮命令。以下应用程序可以异步运行。但我找不到如何将我在 xaml 端指定的 CommandParamater 传递到事件中。

我应该做什么样的申请?如果您能提供帮助,我会很高兴。

AsyncCommand.cs & IAsyncCommand

    public interface IAsyncCommand : ICommand
{
    Task ExecuteAsync(object parameter);
}

public class AsyncCommand : AsyncCommandBase
{
    private readonly Func<Task> _command;
    public AsyncCommand(Func<Task> command)
    {
        _command = command;
    }
    public override bool CanExecute(object parameter)
    {
        return true;
    }
    public override Task ExecuteAsync(object parameter)
    {
        return _command();
    }

}

AsyncCommandBase.cs

    public abstract class AsyncCommandBase : IAsyncCommand
{
    public abstract bool CanExecute(object parameter);
    public abstract Task ExecuteAsync(object parameter);
    public async void Execute(object parameter)
    {
        await ExecuteAsync(parameter);
    }
    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }
    protected void RaiseCanExecuteChanged()
    {
        CommandManager.InvalidateRequerySuggested();
    }
}

视图模型

   ChangePageCommand = new AsyncCommand(async () => await ChangePageClick());

【问题讨论】:

    标签: c# wpf mvvm async-await command


    【解决方案1】:

    您可以将委托的类型从 Func&lt;Task&gt;(不带参数并返回 Task 的方法)更改为 Func&lt;object, Task&gt;(带单个 object 参数并返回 Task 的方法):

    private readonly Func<object, Task> _command;
    public AsyncCommand(Func<object, Task> command) => _command = command;
    public override Task ExecuteAsync(object parameter) => _command(parameter);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-13
      • 2014-06-03
      • 2012-09-04
      • 2011-05-27
      • 1970-01-01
      • 2012-05-13
      • 2016-02-05
      • 1970-01-01
      相关资源
      最近更新 更多