从另一个命令执行命令(Executing a command from another comman

2019-10-20 20:12发布

我有一个“世界你好”的形式(Xamarin的形式),其中一些字段和一个提交按钮。 这里有一个观察,(CanSave),其控制时,SaveChangesCommand可以执行。 如果在CanSave是假按下保存按钮,我想显示一条消息给用户。

用下面的代码,如果我

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

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

现在,我们明确地描述ButtonClicked的命令之间的关系在SaveChangesCommand的条款 - “的SaveChanges时可以执行该命令ButtonClicked启用”



Answer 2:

事实证明,这是ReactiveCommands和canExecute行为的误解。 见ReactiveCommand不尊重canExecute



文章来源: Executing a command from another command
标签: reactiveui