ReactiveUI“令人信服的例子”如何刷新搜索结果
问题描述:
我的问题是针对ReactiveUI给出的“令人信服的例子”,当人在搜索栏中输入时,搜索异步发生。假设我想为我的用户提供刷新当前搜索结果的方法。我可以让他们在搜索栏中退格并重新输入他们的最后一个字符。但是,他们要求提供“刷新”按钮,因为他们不清楚如何刷新当前结果。ReactiveUI“令人信服的例子”如何刷新搜索结果
我想不出如何例子的范围内做到这一点:
public class TheViewModel : ReactiveObject
{
private string query;
private readonly ObservableAsPropertyHelper<List<string>> matches;
public TheViewModel()
{
var searchEngine = this.ObservableForProperty(input => input.Query)
.Value()
.DistinctUntilChanged()
.Throttle(TimeSpan.FromMilliseconds(800))
.Where(query => !string.IsNullOrWhiteSpace(query) && query.Length > 1);
var search = searchEngine.SelectMany(TheSearchService.DoSearchAsync);
var latestResults =
searchEngine.CombineLatest(search, (latestQuery, latestSearch) => latestSearch.Query != latestQuery ? null : latestSearch.Matches)
.Where(result => result != null);
matches = latestResults.ToProperty(this, result => result.Matches);
}
public string Query
{
get
{
return query;
}
set
{
this.RaiseAndSetIfChanged(ref query, value);
}
}
public List<string> Matches
{
get
{
return matches.Value;
}
}
}
有没有人对我如何从一个按钮捕获命令和任何建议重新执行现有的搜索没有清除他们目前的搜索文本?
答
您可以合并现有的Query
更改的可观察项与新的可观察项,当按下刷新按钮时返回当前的Query
。
首先用于刷新按钮的命令:
public ReactiveCommand<Unit, String> Refresh { get; private set; }
然后创建命令,并为其分配,并创建一个合并后的观察到的两个观测值:
Refresh = ReactiveCommand.Create<Unit, String>(() => Query);
var searchEngine = Observable.Merge(
this.ObservableForProperty(input => input.Query).Value().DistinctUntilChanged(),
Refresh)
.Throttle(TimeSpan.FromMilliseconds(800))
.Where(query => !string.IsNullOrWhiteSpace(query) && query.Length > 1);
的其他部分可以保持不变。