Xamarin.Forms按钮在触摸后将被禁用

时间:2019-01-03 07:47:50

标签: button mvvm xamarin.forms command mvvmcross

我使用Xamarin.Forms和MvvmCross,但是在应用程序中遇到了问题。 有时在触摸并运行命令后,按钮会被禁用。

我在按钮上添加了IsEnabled =“ True”,但未更改

<Button 
    WidthRequest="36" 
    HeightRequest="36" 
    CornerRadius="18" 
    BorderWidth="2" 
    FontSize="18" 
    Text="{Binding OptionText}" 
    Command="{Binding OptionSelectedCommand}" 
    CommandParameter="{Binding .}" 
    IsEnabled="True" 
    VerticalOptions="Center" 
    HorizontalOptions="Center"/>

我希望始终启用此按钮。

我的命令代码是:

new MvxAsyncCommand(async () => 
{ 
    if (option.IsSelected) 
    { 
        option.IsSelected = false; 
    } 
    else 
    { 
        option.OptionGroup.Options.ForEach(c => c.IsSelected = false);
        option.IsSelected = true; 
    } 

    return Task.CompletedTask; 
})

2 个答案:

答案 0 :(得分:1)

最后,我找到了有关此问题的解决方案。 问题与MvxAsyncCommand有关,可以通过使用Command而不是MvxAsyncCommand来解决。

我认为MvvmCross MvxAsyncCommand有一个关于运行异步方法的错误

答案 1 :(得分:0)

Mehmet是正确的,此问题的根源在MvxAsyncCommand中。我发现我的MvxAsyncCommand的CanExecute()方法始终返回false。当CanExecute()返回false时,Xamarin表单按钮将被禁用,这是预期的行为。但是为什么CanExecute()总是返回false?我研究了源代码,发现MvxAsyncCommand的CanExecute()方法如果认为任务正在运行,则将返回false。如果在MvxAsyncCommand的构造函数中将allowConcurrentExecutions设置为true,它将绕过该检查,并且该按钮将再次启用。

这需要在MvxAsyncCommand中修复,但是将allowConcurrentExecution = true设置是一种临时解决方法。

MvxAsyncCommand on Github:

public bool CanExecute(object parameter)
{
    if (!_allowConcurrentExecutions && IsRunning)
        return false;
    else
        return CanExecuteImpl(parameter);
}