2014-08-31 3 views
1

У меня есть форма «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; 
    } 
+0

Я больше общался с этим и пересматривал вопрос на то, что, по моему мнению, является более кратким сущностью проблемы. http://stackoverflow.com/q/25636199/494635 –

ответ

0

Как об этом:

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 с точки зрения на SaveChangesCommand - «Команда ButtonClicked включена когда SaveChanges могут быть выполнены «

+0

Спасибо за помощь Пол. «Команда ButtonClicked включена, когда SaveChanges могут быть выполнены» Это действительно «не» то, что я хочу. Я хочу, чтобы кнопка нажата для включения, когда CanSave является ложным, чтобы я мог отобразить сообщение «пожалуйста, введите действительные данные». Затем, только когда CanSave имеет значение true, перейдите к команде Save. Имеют смысл? –

Смежные вопросы