canExecute(false)无效

时间:2015-09-28 11:27:52

标签: android xamarin mvvmcross icommand

我正在开发Xamarin Android Application。我不想执行Mvxcommand虽然它是Executing.What是什么解决方案?
我的代码是:

 var asd = Mvx.Resolve<MyAddressesViewModel> ();
 asd.ItemSelect.CanExecute (false);

3 个答案:

答案 0 :(得分:0)

调用ChangeCanExecute()方法。

答案 1 :(得分:0)

您可以在创建命令实例时传入委托(可能是MvxCommand中的MyAddressesViewModel

所以可能是这样的:

class MyAddressesViewModel
{
    public ICommand ItemSelect
    {
        get
        {
            return new MvxCommand(
                () => {}, // Delegate when command gets invoked 
                () => true); // Delegate to determine CanExecute
        }
    }
}

或类似的东西。

另请注意,正如Dhruv所提到的那样,您需要触发命令的PropertyChanged事件,并使用ChangeCanExecute方法实际调用您在构造函数中注册的CanExecute委托。

答案 2 :(得分:0)

您应该为您的MvxCommand提供一个委托,该委托将被调用以确定用户是否可以执行该命令。您还应该告诉Mvvm Cross何时使用CanExecute手动更新RaiseCanExecuteChanged状态。

以下示例为您提供“登录”按钮,该按钮仅在用户填写了EmployeeId且用户当前未尝试登录时启用:

(视图模型):

    private bool _signInAttemptInProgress;
    protected bool SignInAttemptInProgress
    {
        get { return _signInAttemptInProgress; }
        set
        {
            _signInAttemptInProgress = value; 
            SignInCommand.RaiseCanExecuteChanged();
        }
    }

    private string _employeeId;
    public string EmployeeId
    {
        get { return _employeeId; }
        set
        {
            _employeeId = value; 
            RaisePropertyChanged(() => EmployeeId); 
            SignInCommand.RaiseCanExecuteChanged();
        }
    }

    private MvxCommand _signInCommand;
    public IMvxCommand SignInCommand
    {
        get { return _signInCommand ?? (_signInCommand = new MvxCommand(async () => await OnSignInCommand(), CanExecuteSignInCommand)); }
    }

    private bool CanExecuteSignInCommand()
    {
        return !SignInAttemptInProgress && !string.IsNullOrEmpty(EmployeeId);
    }

    private async Task OnSignInCommand()
    {
        SignInAttemptInProgress = true;
        // Do stuff here. The user can't click the SignIn command inside here.
        SignInAttemptInProgress = false;
        // The user can click the SignIn command again below here.
    }

使用自己的IMvxCommand实现会阻止自己在当前正在执行时再次执行,这样会更加清晰。然后,您不需要使用额外的SignInAttemptInProgress样式属性来丢弃ViewModel。