执行ReactiveCommand后延迟显示UI控件

时间:2018-07-04 06:10:05

标签: system.reactive reactiveui rx.net

我有一个根据信号执行的反应性命令readCommand

IObservable<Unit> readSignal = ...

readSignal.InvokeCommand(readCommand);

命令的结果显示在用户控件中,例如TextBox

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

我尝试显示/隐藏refresh buttonIsRefreshable链接到Visibility的{​​{1}}属性。

refresh button

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快,显然是行不通的。

1 个答案:

答案 0 :(得分:1)

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

>

SelectManySelect / 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);