Выполнение команды из другой команды

У меня есть форма «hello world» (формы Xamarin) с некоторыми полями и кнопкой отправки. Существует наблюдаемая (CanSave), которая контролирует, когда может выполняться команда SaveChangesCommand. Если кнопка сохранения нажата, когда CanSave имеет значение false, я хочу отобразить сообщение пользователю.

С приведенным ниже кодом, если я

  1. ввести неверные данные
  2. нажмите «Сохранить» (появится сообщение об ошибке)
  3. затем исправьте данные.

CanSave становится истинным, и выполняется команда SaveChangesCommand — до повторного нажатия кнопки. Это как если бы ранее заблокированное нажатие кнопки было поставлено в очередь до тех пор, пока canExecute не станет истинным.

Что мне не хватает?

Спасибо :-)

 public PersonalProfileModel()
    {
        this.SaveChangesCommand = ReactiveCommand.CreateAsyncTask(this.CanSave(),  message => this.doAllThings(message as string));
        this.ButtonClickedCommand = ReactiveCommand.Create(Observable.Return(true));
        this.ButtonClickedCommand.InvokeCommand(this.SaveChangesCommand);
        // ButtonClickedCommand.Subscribe(x => this.SaveChangesCommand.Execute("hello")); // tried this too
    }

    public ReactiveCommand<object> ButtonClickedCommand { get; set; }
    public ReactiveCommand<string> SaveChangesCommand;

    public IObservable<bool> CanSave()
    {
        var fieldsValid = this.WhenAnyValue(
            x => x.Name,
            x => x.Country,
            (f1, f2) =>
                f1 == "a"
                && f2 == "b");
        return fieldsValid;
    }

    public Task<string> doAllThings(string message)
    {
        var result = Task.Run(() =>{return "hello " + message;});
        return result;
    }

person Damien Sawyer    schedule 31.08.2014    source источник
comment
Я больше поиграл с этим и пересмотрел вопрос, сказав, что я считаю более краткой сутью проблемы. stackoverflow.com/q/25636199/494635   -  person Damien Sawyer    schedule 03.09.2014


Ответы (2)


Как насчет этого:

this.SaveChangesCommand = ReactiveCommand.CreateAsyncTask(
    this.CanSave(),  
    message => this.doAllThings(message as string));

this.ButtonClickedCommand = ReactiveCommand.CreateAsyncObservable(
    SaveChangesCommand.CanExecuteObservable.StartWith(true),
    x => SaveChangesCommand.ExecuteAsync(x));

Теперь мы явно описываем взаимосвязь между командой ButtonClicked с точки зрения команды SaveChanges — «Команда ButtonClicked активируется, когда можно выполнить SaveChanges».

person Ana Betts    schedule 02.09.2014
comment
Спасибо за помощь Павел. Команда ButtonClicked включается, когда можно выполнить SaveChanges. На самом деле это «не то», что я хочу. Я хочу, чтобы нажатие кнопки было включено, когда CanSave имеет значение false, чтобы я мог отображать сообщение «пожалуйста, введите действительные данные». Затем, только когда CanSave имеет значение true, переходите к команде Save. Есть смысл? - person Damien Sawyer; 03.09.2014

Это оказалось недоразумением в поведении ReactiveCommands и canExecute. См. ReactiveCommand, не учитывающий canExecute.

person Damien Sawyer    schedule 03.09.2014