C# DelegateCommand和表达式声明中的CanExecute不';行不通

C# DelegateCommand和表达式声明中的CanExecute不';行不通,c#,xamarin,xamarin.forms,prism,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 { get; }

Func<bool> canExecuteLogIn = () => !StringService.IsNullOrEmpty(_entries.LoginText, _entries.PasswordText);
LogInCommand = new DelegateCommand(OnLogInTapped, canExecuteLogIn);
我这样检查:

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

不起作用,我的意思是Func在初始化后从不执行

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

这个

相当于这个

public DelegateCommand LogInCommand { get {return new DelegateCommand(...)}}
因此,每次访问
LogInCommand
属性时,它都会返回新的
DelegateCommand
实例。这意味着您对命令的新实例执行
raisecancecutechanged
,之前调用此属性并且可以对此更改作出反应的所有代码都使用自己的实例


这与第一个场景不同,在第一个场景中,每个人都只使用一个
DelegateCommand
实例。

我认为表达式声明检查内部是否创建了实例。但是,如果我像你建议的那样进行初始化,为什么我必须有字段,这些字段在使用中是静态的呢?这意味着
=>
=
具有不同的初始化机制?当然
=>
=
是不同的。我已经在答案中展示了什么是初始化的等价物(对于属性,而不是一般)。但我不明白你的第一句话“我必须有字段,它们是静态的”,它说我“不能在静态上下文中访问非静态字段”。它还与OnLogInTapped有关。啊,我错过了你访问代理中的字段的机会。是的,那么您不能使用该语法,因为它类似于将
readonly
字段声明为属性的支持字段,并且您不能在字段初始值设定项中执行该操作(请参见此处的一点说明-)。所以最好只使用第一种语法。
Property=newproperty()
不是属性,而是字段
Property{get;}=new..
是一个由只读字段支持的属性(因此:
Property{get{return\u Property;}}}}}\u Property=new…
。字段初始值设定项在构造函数之前运行,因此您不能在那里引用实例成员。为了更清楚,我建议您阅读此答案:。
public DelegateCommand LogInCommand => new DelegateCommand(...)
public DelegateCommand LogInCommand { get {return new DelegateCommand(...)}}