首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >canExecute(false)不工作

canExecute(false)不工作
EN

Stack Overflow用户
提问于 2015-09-28 19:27:52
回答 3查看 744关注 0票数 0

我正在做Xamarin Android应用程序,我不想执行the命令,尽管它是Executing.What是解决方案吗?

我的代码是:

代码语言:javascript
复制
 var asd = Mvx.Resolve<MyAddressesViewModel> ();
 asd.ItemSelect.CanExecute (false);
EN

回答 3

Stack Overflow用户

发布于 2015-09-29 03:31:06

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

所以大概是这样的:

代码语言:javascript
复制
class MyAddressesViewModel
{
    public ICommand ItemSelect
    {
        get
        {
            return new MvxCommand(
                () => {}, // Delegate when command gets invoked 
                () => true); // Delegate to determine CanExecute
        }
    }
}

或者类似的东西。

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

票数 1
EN

Stack Overflow用户

发布于 2015-09-28 21:04:32

调用ChangeCanExecute()方法。

票数 0
EN

Stack Overflow用户

发布于 2015-10-01 04:57:05

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

下面是一个为您提供登录按钮的示例,该按钮仅在用户填写了EmployeeId且用户当前未尝试登录时才会启用:

(ViewModel):

代码语言:javascript
复制
    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实现防止自己在当前执行时再次执行,那会更干净。这样就不需要在ViewModels中添加额外的SignInAttemptInProgress样式属性了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32821876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档