gpt4 book ai didi

c# - 如何让 XAML 命令执行异步?

转载 作者:太空狗 更新时间:2023-10-30 01:18:53 25 4
gpt4 key购买 nike

假设我有以下命令

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com