【发布时间】:2018-07-05 08:38:42
【问题描述】:
我有一个基于信号执行的响应式命令 readCommand。
IObservable<Unit> readSignal = ...
readSignal.InvokeCommand(readCommand);
命令的结果显示在用户控件中,比如TextBox。
我想在TextBox 旁边放置一个refresh button,单击它会调用readCommand。该按钮在命令执行时不可见,然后在命令执行 5 秒后可见。
接下来我尝试显示/隐藏refresh button。 IsRefreshable 链接到refresh button 的Visibility 属性。
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之后尝试输入.Switch()运算符。我怀疑你有一个IObservable<IObservable<T>>,需要减少到最新的内部IObservable<T>。 -
@Enigmativity 是的,它似乎工作正常。唯一的变化是
SelectMany需要替换为Select。SelectMany将其展平,而Select返回IObservable<IObservable<bool>>。我也通过以下方式解决了它,但您的解决方案很优雅。介意把它作为答案吗?所以其他人很容易找到它,而不是依赖这里的 cmets。readCommand.IsExecuting.Where(x => !x).Select(x => Observable.Timer(refreshTimeout)).Switch().Select(x => true).Merge(readCommand.IsExecuting.Where(x => x).Select(x => !x)).ToPropertyEx(...);
标签: system.reactive reactiveui rx.net