我有一个根据信号执行的反应性命令readCommand
。
IObservable<Unit> readSignal = ...
readSignal.InvokeCommand(readCommand);
命令的结果显示在用户控件中,例如TextBox
。
我想在refresh button
旁边放置一个TextBox
,单击该链接会调用readCommand
。在执行命令时该按钮应该不可见,然后在执行命令5秒钟后变为可见。
我尝试显示/隐藏refresh button
。 IsRefreshable
链接到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
快,显然是行不通的。
答案 0 :(得分:1)
使用SelectMany
,您可以通过合并所有内部可观察对象将IObservable<IObservable<T>>
转换为IObservable<T>
-这意味着所有计时器都会触发,从而导致不良行为。
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);