DelegateCommand和表达式声明中的CanExecute不起作用

时间:2017-03-28 09:48:58

标签: c# xamarin xamarin.forms prism

我的问题很简单。 为什么会这样:

public DelegateCommand LogInCommand { get; }

Func<bool> canExecuteLogIn = () => !StringService.IsNullOrEmpty(_entries.LoginText, _entries.PasswordText);
LogInCommand = new DelegateCommand(OnLogInTapped, canExecuteLogIn);

但这不是:

public DelegateCommand LogInCommand => new DelegateCommand(OnLogInTapped,
            () => !StringService.IsNullOrEmpty(_entries.LoginText, _entries.PasswordText));

我这样检查:

 public string LoginEntryText
        {
            get { return _entries.LoginText; }
            set
            {
                _entries.LoginText = value;
                LogInCommand?.RaiseCanExecuteChanged();
            }
        }

不起作用,我的意思是Func在初始化后永远不会执行。

1 个答案:

答案 0 :(得分:1)

问题对我来说并不完全清楚,但我怀疑原因如下。

public DelegateCommand LogInCommand => new DelegateCommand(...)

等同于此

public DelegateCommand LogInCommand { get {return new DelegateCommand(...)}}

因此,每次访问LogInCommand属性时,它都会返回新的DelegateCommand实例。这意味着您对命令的新实例执行RaiseCanExecuteChanged,之前调用此属性的所有代码以及可以对此更改做出反应的代码都使用它们自己的实例。

这不同于第一种情况,即每个人都只使用DelegateCommand个实例。