【问题标题】:How to get XAML Command to execute Async?如何让 XAML 命令执行异步?
【发布时间】:2014-10-08 17:52:01
【问题描述】:

假设我有以下命令

public class SignOutCommand : CommandBase, ISignOutCommand
{
    private readonly UserModel _userModel;
    private readonly IUserService _userService;

    public SignOutCommand(IUserService userService)
    {
        _userService = userService;
        _userModel = App.CurrentUser;
    }

    public bool CanExecute(object parameter)
    {
        var vm = parameter as EditProfileViewModel;
        return vm != null;
    }

    public Task<bool> CanExecuteAsync(object parameter)
    {
        return Task.Run(() => CanExecute(parameter);
    }

    public void Execute(object parameter)
    {
        var vm = (EditProfileViewModel)parameter;
        var signOutSucceeded = SignOutUser();

        if (signOutSucceeded)
        {
            vm.AfterSuccessfulSignOut();
        }
    }

    public Task ExecuteAsync(object parameter)
    {
        return Task.Run(() => Execute(parameter);
    }

    private bool SignOutUser()
    {
        // populate this so that we get the attached collections.
        var user = _userService.GetByEmailAddress(_userModel.Email);
        _userService.RevokeLoggedInUser(user);
        return true;
    }
}

我的 XAML 有一个按钮

        <Button Text="Sign out"
                Command="{Binding SignOutCommand}"
                CommandParameter="{Binding}" />

执行ExecuteAsync 而不是Execute 需要什么?对不起,如果这很简单,我对 XAML 很陌生。

另外,我实际上是在 Xamarin.Forms XAML 中执行此操作,不确定它是否在这里有所作为。

【问题讨论】:

标签: c# xaml asynchronous command


【解决方案1】:

您可以通过这种方式简单地实现您的命令

public class SignOutCommand : ICommand
{
    public bool CanExecute(object parameter)
    {
        var vm = parameter as EditProfileViewModel;
        return vm != null;
    }

    public async void Execute(object parameter)
    {
        Task.Run(() => 
        {
            var vm = (EditProfileViewModel)parameter;
            var signOutSucceeded = SignOutUser();

            if (signOutSucceeded)
            {
                vm.AfterSuccessfulSignOut();
            }
        }
    }

    ...
}

但是绑定的按钮在执行过程中并没有被禁用,即使命令已经在运行也可以执行...

如果您需要在执行期间无法执行命令,请查看:

异步实现 CanExecute 会更棘手...

【讨论】:

  • 我做过类似的事情,是的,我可以毫无问题地禁用按钮。我只是想知道是否有办法执行该方法的异步版本。
猜你喜欢
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-26
  • 1970-01-01
相关资源
最近更新 更多