绑定时按钮被禁用
Button is disabled when binding
我的 ViewModel 中有一个 IMvxAsyncCommand 方法来执行服务器调用,并根据结果导航到 ViewModel 或其他。我不知道为什么,但它禁用了绑定点击事件的按钮。
public IMvxAsyncCommand Register
{
var runner = Task.Run(() => _service.Register());
runner.Wait();
if (runner.Result.Status == SUCCESS)
{
return new MvxAsyncCommand(() => _navigationService.Navigate<NextViewModel>());
}
else
{
return new MvxAsyncCommand(() => _navigationService.Navigate<ErrorViewModel>());
}
}
我尝试将运行程序移至异步方法并设置一个带有响应的全局变量,但我仍然遇到此问题。如果我评论服务调用并只留下 navigationService 代码,那么按钮将被启用,所以我想问题出在我对这个方法进行服务调用的方式上。
首先,您的代码片段无法编译。如果它是 属性 Getter,它将阻塞直到 _service.Register()
完成,这可能不是您想要的。相反,您应该将该调用放入命令中并等待它:
private IMvxAsyncCommand _register;
public ICommand Register => _register = _register ?? new MvxAsyncCommand(DoRegisterCommand);
private async Task DoRegisterCommand()
{
var result = await _service.Register();
if (result.Status == SUCCESS)
await _navigationService.Navigate<NextViewModel>();
else
await _navigationService.Navigate<ErrorViewModel>();
}
我的 ViewModel 中有一个 IMvxAsyncCommand 方法来执行服务器调用,并根据结果导航到 ViewModel 或其他。我不知道为什么,但它禁用了绑定点击事件的按钮。
public IMvxAsyncCommand Register
{
var runner = Task.Run(() => _service.Register());
runner.Wait();
if (runner.Result.Status == SUCCESS)
{
return new MvxAsyncCommand(() => _navigationService.Navigate<NextViewModel>());
}
else
{
return new MvxAsyncCommand(() => _navigationService.Navigate<ErrorViewModel>());
}
}
我尝试将运行程序移至异步方法并设置一个带有响应的全局变量,但我仍然遇到此问题。如果我评论服务调用并只留下 navigationService 代码,那么按钮将被启用,所以我想问题出在我对这个方法进行服务调用的方式上。
首先,您的代码片段无法编译。如果它是 属性 Getter,它将阻塞直到 _service.Register()
完成,这可能不是您想要的。相反,您应该将该调用放入命令中并等待它:
private IMvxAsyncCommand _register;
public ICommand Register => _register = _register ?? new MvxAsyncCommand(DoRegisterCommand);
private async Task DoRegisterCommand()
{
var result = await _service.Register();
if (result.Status == SUCCESS)
await _navigationService.Navigate<NextViewModel>();
else
await _navigationService.Navigate<ErrorViewModel>();
}