ReactiveUI“令人信服的示例”如何刷新搜索结果

时间:2017-03-15 17:35:03

标签: wpf reactive-programming 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;
        }
    }
} 

有没有人对如何从按钮捕获命令并重新执行现有搜索而不清除其当前搜索文本有任何建议?

1 个答案:

答案 0 :(得分:1)

您可以将现有的Query更改的可观察值与新的observable合并,在按下刷新按钮时返回当前Query

首先是刷新按钮的命令:

public ReactiveCommand<Unit, String> Refresh { get; private set; }

然后创建命令并分配它,并创建两个observable的合并observable:

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

其余的可以保持不变。