2017-03-15 70 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; } 

然後創建命令,併爲其分配,並創建一個合併後的觀察到的兩個觀測值:

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

的其他部分可以保持不變。