作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有以下命令
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();
}
}
}
...
}
但是绑定(bind)的按钮在执行过程中不会被禁用,即使命令已经在运行中也可以执行...
如果你需要命令在执行过程中不能被执行,请看:
异步实现 CanExecute 会更棘手...
关于c# - 如何让 XAML 命令执行异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25318885/
我是一名优秀的程序员,十分优秀!