2014-08-31 82 views
1

我有一個'你好世界'形式(Xamarin形式)與一些領域和一個提交按鈕。有一個可觀察的(CanSave)來控制SaveChangesCommand何時可以執行。如果在CanSave爲false時按下保存按鈕,我想要向用戶顯示一條消息。執行從另一個命令的命令

與下面的代碼,如果我

  1. 輸入不正確的數據
  2. 單擊保存(錯誤消息顯示)
  3. 然後更正數據。

CanSave成爲true並執行SaveChangesCommand - 在再次按下按鈕之前。就好像之前阻止的按鈕按下了隊列,直到canExecute成爲true。

我錯過了什麼?

感謝:-)

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 – 2014-09-03 04:24:36

回答

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)); 

現在,我們明確地描述在SaveChangesCommand方面ButtonClicked的命令之間的關係 - 「大ButtonClicked命令啓用當SaveChanges可以執行時「

+0

感謝您的幫助保羅。 「可以執行SaveChanges時啓用ButtonClicked命令」 這實際上不是我想要的。 CanSave爲false時,我希望啓用按鈕點擊,以便我可以顯示'請輸入有效數據'消息。然後,只有當CanSave爲真時,才能通過保存命令。合理? – 2014-09-02 22:46:55