AutoProperties不适用于DelegateCommand.ObservesCanExecute in棱镜吗?

时间:2019-12-25 13:52:28

标签: xamarin properties command prism delegatecommand

我对棱镜中DelegateCommand上的ObservesCanExecute有一些不了解的地方。 AutoProperties值得一看...我想

我有一个带有按钮的视图,该按钮绑定到我的视图模型中的DelegateCommand。 出于某些原因,在我看来,我捕获了CanExecuteChanged事件,如下所示:

MyButton.Command.CanExecuteChanged += Command_CanExecuteChanged;

问题是,在我的视图模型中,当我使用自动属性声明IsEnabled时,视图中的事件未触发。就像ObservesCanExecute不再起作用一样。正常吗?我在做错什么吗?我认为AutoProperties和Properties完全相同... 这是我的ViewModel:

public class MainPageViewModel : ViewModelBase
{
    // VERSION 1 - It Works
    private bool _isEnabled = true;
    public bool IsEnabled
    {
        get { return _isEnabled; }
        set { SetProperty(ref _isEnabled, value); }
    }

    // VERSION 2 - Don't works
    // public bool IsEnabled {get; set; } = true;

    public DelegateCommand MyCommand { get; set; } = null;

    public MainPageViewModel(INavigationService navigationService)
        : base(navigationService)
    {
        Title = "Main Page";
        MyCommand = new DelegateCommand(Execute).ObservesCanExecute(() => IsEnabled);
    }

    private void Execute()
    {
        IsEnabled = !IsEnabled;
    }
}

1 个答案:

答案 0 :(得分:1)

ObservesCanExecuteChanged依赖于包含观察到的属性的类的INotifyPropertyChanged

这会在发生更改时引发事件并因此起作用

private bool _isEnabled = true;
public bool IsEnabled
{
    get { return _isEnabled; }
    set { SetProperty(ref _isEnabled, value); }
}

正如您观察到的那样,这不会引发任何事件且不起作用:

public bool IsEnabled { get; set; }
  

我认为AutoProperties和Properties完全相同

那是完全错误的。 “ AutoProperty”是“ Property”,但这仅涉及相似之处。从类的外部看,它们看起来很像,但是属性可以做任何事情,而auto属性只是一个过于复杂的字段。