2017-03-15 8 views
1

私の質問は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

Queryの既存の観測値をマージして、リフレッシュボタンを押したときに現在のQueryを返す新しい観測値をマージすることができます。まず

リフレッシュボタンのコマンド:

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

その後、コマンドを作成し、それを割り当て、2回の観測のマージされ、観察を作成します。

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

残りはそのまま滞在することができます。

関連する問題