执行 ReactiveCommand 后延迟显示 UI 控件

Delayed display of a UI control after execution of ReactiveCommand

我有一个基于信号执行的反应命令readCommand

IObservable<Unit> readSignal = ...

readSignal.InvokeCommand(readCommand);

命令的结果显示在用户控件中,比方说 TextBox

我想在 TextBox 旁边放置一个 refresh button,单击它会调用 readCommand。此按钮在执行命令时不应该可见,然后在执行命令 5 秒后可见。

我对 display/hide refresh button 的尝试如下。 IsRefreshable 链接到 refresh buttonVisibility 属性。

readCommand
    .IsExecuting
    .SelectMany(x => (x ? Observable.Timer(TimeSpan.FromMilliseconds(0)) : Observable.Timer(refreshTimeout)).Select(_ => !x))
    .ToPropertyEx(this, vm => vm.IsRefreshable, false, false, RxApp.MainThreadScheduler);

我认为当 readSignal 的发射速率低于刷新速率 (refreshTimeout) 时,它工作正常。但如果 readSignal 速率快于 refreshTimeout.

则显然不起作用

对于 SelectMany,您通过合并所有内部可观察对象将 IObservable<IObservable<T>> 转变为 IObservable<T> - 这意味着所有计时器都会触发,从而导致不良行为。

A SelectMany 实际上与 Select/Merge 组合相同。

您需要的只是从最新生成的内部可观察对象中生成值。为此,您需要 Select/Switch 组合。

试试这个:

readCommand
    .IsExecuting
    .Select(x => x
        ? Observable.Timer(TimeSpan.FromMilliseconds(0))
        : Observable.Timer(refreshTimeout).Select(_ => !x))
    .Switch()
    .ToPropertyEx(this, vm => vm.IsRefreshable, false, false, RxApp.MainThreadScheduler);