首页 > 解决方案 > Prism DelegateCommand 中的 CanExecute 不起作用

问题描述

当我在短时间内单击该按钮几次时,每次都会调用该方法并且我的应用程序崩溃(当代码尝试导航到另一个页面时)。此问题仅在 Xamarin.Android 中出现(iOS 处理双击)

public bool IsBusy { get; set; }

private DelegateCommand<string> _eventDetailsCommand;
public DelegateCommand<string> EventDetailsCommand => _eventDetailsCommand ?? (_eventDetailsCommand = new DelegateCommand<string>(EventDetails, (x) => !IsBusy));

private void EventDetails(string obj)
{
    IsBusy = true;
    await _navigationService.NavigateAsync("AnotherPage");
    IsBusy = false;
}

Xamarin.Android

棱镜:7.1.0.172(预)

PropertyChanged.Fody (2.2.6):

标签: xamarin.formsxamarin.androidprism

解决方案


最重要的一点是DelegateCommand.RaiseCanExecuteChanged

您应该首先将 CanNavigate 设置为 false 并且按钮将被禁用,在按钮命令方法代码完成后将其设置为 true

这是我的例子,它工作正常:

    private bool _canNavigate = true;
    public bool CanNavigate
    {
        get { return _canNavigate; }
        set { 
            SetProperty(ref _canNavigate, value);
            LoginCommand.RaiseCanExecuteChanged();
        }
    }

    private DelegateCommand _loginCommand;
    public DelegateCommand LoginCommand => _loginCommand ?? (_loginCommand = new DelegateCommand(Login, () => CanNavigate));
    public async void Login()
    {
        CanNavigate = false;
        
        ...do something here

        CanNavigate = true;
    }

推荐阅读