Reactiveui 从另一个命令执行命令

Reactiveui 从另一个命令执行命令,reactiveui,Reactiveui,我有一个“hello world”表单(Xamarin表单),带有一些字段和一个提交按钮。有一个可观察的(CanSave),它控制SaveChangesCommand何时可以执行。如果在CanSave为false时按下save按钮,我想向用户显示一条消息 使用下面的代码,如果我 输入不正确的数据 单击保存(错误消息显示) 然后更正数据 CanSave变为true,并在再次点击按钮之前执行SaveChangesCommand。这就好像之前被阻止的按钮按下被排队,直到canExecute成为现实 我

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

使用下面的代码,如果我

  • 输入不正确的数据
  • 单击保存(错误消息显示)
  • 然后更正数据
  • CanSave变为true,并在再次点击按钮之前执行SaveChangesCommand。这就好像之前被阻止的按钮按下被排队,直到canExecute成为现实

    我错过了什么

    谢谢:-)

    public PersonalProfileModel()
    {
    this.SaveChangesCommand=ReactiveCommand.CreateAsyncTask(this.CanSave(),message=>this.doAllThings(消息为字符串));
    this.ButtonClickedCommand=ReactiveCommand.Create(Observable.Return(true));
    this.ButtonClickedCommand.InvokeCommand(this.SaveChangesCommand);
    //ButtonClickedCommand.Subscribe(x=>this.SaveChangesCommand.Execute(“hello”);//也尝试过这个
    }
    公共反应命令按钮ClickedCommand{get;set;}
    公共反应命令保存更改命令;
    公共IObservable CanSave()
    {
    var fieldsValid=this.whenyValue(
    x=>x.Name,
    x=>x.国家,
    (f1,f2)=>
    f1==“a”
    &&f2==“b”);
    返回字段有效;
    }
    公共任务doAllThings(字符串消息)
    {
    var result=Task.Run(()=>{return“hello”+message;});
    返回结果;
    }
    
    这个怎么样:

    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命令之间的关系——“当可以执行SaveChanges时,ButtonClicked命令被启用”

    这被证明是对ReactiveCommands和canExecute行为的误解。
    参见

    谢谢你的帮助,保罗。“ButtonClicked命令在可以执行SaveChanges时启用”这实际上不是我想要的。我希望在CanSave为false时启用按钮单击,以便显示“请输入有效数据”消息。然后,仅当CanSave为true时,才传递到Save命令。有意义吗?我对这个问题做了更多的研究,并将问题修改为我认为更简洁的问题本质。
    this.SaveChangesCommand = ReactiveCommand.CreateAsyncTask(
        this.CanSave(),  
        message => this.doAllThings(message as string));
    
    this.ButtonClickedCommand = ReactiveCommand.CreateAsyncObservable(
        SaveChangesCommand.CanExecuteObservable.StartWith(true),
        x => SaveChangesCommand.ExecuteAsync(x));