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

CanExecute in DelegateCommand and expression declaration doesn't work

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

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在初始化之后就再也不执行了。

问题对我来说不是很清楚,但我怀疑原因如下。

这个

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

相当于这个

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

所以每次你访问 LogInCommand 属性 - 它 returns 新的 DelegateCommand 实例。这意味着您在命令的新实例上执行 RaiseCanExecuteChanged,并且之前调用此 属性 并且可以对此更改做出反应的所有代码都使用它们自己的实例。

这与第一种情况不同,第一种情况只有一个 DelegateCommand 实例供所有人使用。