public class MyViewModel : INotifyPropertyChanged { private bool _isButtonEnabled; public bool IsButtonEnabled { get { return _isButtonEnabled; } set { _isButtonEnabled = value; OnPropertyChanged(nameof(IsButtonEnabled)); } } public DelegateCommand MyCommand { get; } public MyViewModel() { MyCommand = new DelegateCommand(Execute, CanExecute) .ObservesProperty(() => IsButtonEnabled); } private void Execute() { // do something } private bool CanExecute() { return IsButtonEnabled; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
public class MyViewModel2 : INotifyPropertyChanged { private bool _isFirstNameValid; private bool _isLastNameValid; public bool IsFirstNameValid { get { return _isFirstNameValid; } set { _isFirstNameValid = value; OnPropertyChanged(nameof(IsFirstNameValid)); } } public bool IsLastNameValid { get { return _isLastNameValid; } set { _isLastNameValid = value; OnPropertyChanged(nameof(IsLastNameValid)); } } public DelegateCommand MyCommand { get; } public MyViewModel2() { MyCommand = new DelegateCommand(Execute, CanExecute) .ObservesProperty(() => IsFirstNameValid) .ObservesProperty(() => IsLastNameValid); } private void Execute() { // do something } private bool CanExecute() { return IsFirstNameValid && IsLastNameValid; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }In this example, the MyCommand command automatically updates its status based on the values of both IsFirstNameValid and IsLastNameValid properties. When both properties are true, the command will be enabled. When either property is false, the command will be disabled. The DelegateCommand ObservesProperty is part of the Prism library package.