如何获得XAML命令执行异步

本文关键字:执行 异步 命令 XAML 何获得 | 更新日期: 2023-09-27 18:18:09

假设我有以下命令

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,不确定这里是否有区别

如何获得XAML命令执行异步

您可以这样简单地实现您的命令

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();
            }
        }
    }
    ...
}

但是绑定的按钮在执行过程中不会被禁用,即使该命令已经在运行,也可以执行…

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

  • https://mytoolkit.codeplex.com/wikipage?title=AsyncRelayCommand
  • 源代码:https://xp-dev.com/svn/mytoolkit/MyToolkit/Command/

异步实现CanExecute会更棘手…