从另一个命令执行命令

时间:2014-08-31 10:42:04

标签: reactiveui

我有一个'hello world'表单(Xamarin表单),包含一些字段和提交按钮。有一个可观察的(CanSave)控制SaveChangesCommand何时可以执行。如果在CanSave为false时按下保存按钮,我想向用户显示一条消息。

使用下面的代码,如果我

  1. 输入错误数据
  2. 点击保存(显示错误消息)
  3. 然后更正数据。
  4. CanSave变为true并且执行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;
        }
    

2 个答案:

答案 0 :(得分:1)

这个怎么样:

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命令之间的关系 - &#34;当SaveChanges可以被执行时,ButtonClicked命令被启用&#34;

答案 1 :(得分:0)

这对ReactiveCommands和canExecute的行为造成了误解。 见ReactiveCommand not respecting canExecute