我有这样的事情:
this.WhenAnyValue(x => x.SearchText)
.Where(text => !string.IsNullOrempty(text))
.Throttle(TimeSpan.FromSeconds(0.25))
.InvokeCommand(searchCmd);
其中SearchText是绑定到文本框的字符串属性,而searchCmd是ReactiveCommand。
我想要的是,如果searchCmd已在运行,则observable应该等待。例如,如果用户键入“gener”并在小暂停后键入“ally”,则命令仍将继续运行,并且不会执行“一般”,只执行“gener”。
有什么想法吗?
编辑:我正在做什么(它看起来有效):
首先我添加了OAPH:
readonly ObservableAsPropertyHelper<bool> isCmdRunning;
和一个财产:
public bool IsCmdRunning => isCmdRunning.Value;
然后,在cosntructor中:
this.searchCmd.IsExecuting
.ToProperty(this, x => x.IsCmdRunning, out isCmdRunning);
最后:
this.WhenAnyValue(x => x.SearchText, x => x.IsCmdRunning, (search, running) => new {Search = search, Running = running})
.Where(value => !string.IsNullOrempty(value.Search) && !value.Running)
.Throttle(TimeSpan.FromSeconds(0.25))
.Select(value => value.Search)
.InvokeCommand(searchCmd);
但我不知道是否有更好的方法。
答案 0 :(得分:0)
我认为使用CancellationToken是一个很好的解决方案。
搜索命令:
Search = ReactiveCommand.CreateFromObservable(
() => Observable
.StartAsync(ct => SearchImpl(ct))
.TakeUntil(CancelSearch));
CancelSearch命令:
CancelSearch = Command.Create(() => {}, Search.IsExecuting);
最后:
this.WhenAnyValue(x => x.SearchText)
.Do(_ => Observable.Return(Unit.Default).InvokeCommand(CancelSearch))
.Throttle(TimeSpan.FromSeconds(0.25))
.InvokeCommand(searchCmd);