ICommand
Реализации предназначены для сборки в виде связываемых команд
DelegateCommand.RaiseCanExecuteChange () должен обновляться, если кнопка включена в пользовательском интерфейсе.
Он не предназначен для использования в логике команд.
Например:
Привязка кнопки сохранения XAML <Button Command="{Binding SaveCommand}" />
Команда ViewModel, в которой кнопка активна только в том случае, если запись должна быть сохранена
private DelegateCommand _saveCommand;
public DelegateCommand SaveCommand =>
_saveCommand ?? (_saveCommand = new DelegateCommand(ExecuteSaveCommand, CanExecuteSaveCommand));
void ExecuteSaveCommand()
{
// Save logic goes here
}
private bool CanExecuteSaveCommand()
{
var isDirty = CurrentRecord.GetIsDirty();
return isDirty;
}
Когда пользовательский интерфейс привязан, выполняется метод SaveCommand CanExecuteSaveCommand (), и давайте предположим, что запись НЕ загрязнена при загрузке.
Хитрость заключается в том, чтобы подключить событие, чтобы при обновлении MyRecord кнопка UI активировалась путем вызова _saveCommand.RaiseCanExecuteChanged
public MainWindowViewModel(IRecordDataService dataService)
{
CurrentRecord = dataService.GetRecord();
CurrentRecord.Updated += (sender, args) => _saveCommand.RaiseCanExecuteChanged();
}