2014-08-31 105 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