如何获得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,不确定这里是否有区别
您可以这样简单地实现您的命令
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会更棘手…