2016-08-19 21 views
0

ReactiveUIを使用して私の最初のステップを踏んでいますが、非常に基本的な例を得ることができません。私は、プロパティ "SearchTerm"が変更されるとすぐにタスクを実行したい。私は、ReactiveUIのgithubページの指示に従った( "説得力のある例")。ReactiveUI:プロパティの変更に反応する

私はビュー内のTextBoxにバインドされたSearchTermプロパティを持つViewModelを持っています。 TextBoxの内容を更新すると、プロパティが予想どおりに更新されます(私はUpdateSourceTrigger=PropertyChangedを使用しました)。

私の観測でコードが発火することはありません:あなたはどこにでもコマンドを呼び出すされていないため、

public class MainWindowViewModel: ReactiveObject 
{ 
    public string SearchTerm 
    { 
     get { return m_SearchTerm; } 
     set { this.RaiseAndSetIfChanged(ref m_SearchTerm, value); } 
    } 

    private string m_SearchTerm; 

    public MainWindowViewModel() 
    { 
     SearchResults = new List<string>(); 

     var canSearch = this.WhenAny(x => x.SearchTerm, x => !string.IsNullOrWhiteSpace(x.GetValue())); 

     var search = ReactiveCommand.CreateAsyncTask(canSearch, 
       async _ => { 
        // this is never called 
        return await dosearch(this.SearchTerm); 
       }); 

      search.Subscribe(results => { 
       // this is never called too 
       SearchResults.Clear(); 
       SearchResults.AddRange(results); 
      }); 
     } 

     private async Task<List<string>> dosearch(string searchTerm) 
     { 
      await Task.Delay(1000); 

      return new List<string>() { "1", "2", "3" }; 
     } 

     public List<string> SearchResults { get; private set; } 
    } 

答えて

1

をあなたのコマンド内のコードは、発火することはありません。任意のイベント(入力テキストの変更、ボタンのクリックなど)にコマンドをバインドする必要があります。 、次の

public ReactiveCommand<List<string>> Search { get; private set; } 

をコンストラクタでそれを割り当てます:

まず、ViewModelからあなたのコマンドを公開ついに、コマンドを呼び出す

this.Search = ReactiveCommand.CreateAsyncTask(canSearch, 
       async _ => { 
        return await dosearch(this.SearchTerm); 
       }); 

としたときに、入力の変化(これは非常に重要ですあなたのコードの一部が欠けている):

this.WhenAnyValue(x => x.SearchTerm) 
    .InvokeCommand(this, x => x.Search); 

abouveコードをコンストラクタに入れます。

これは、ユーザーが入力すると常に検索を開始することに注意してください。これを修正するには、Throttle,as seen in the example you linked toというRx演算子を使用できます。

+0

素晴らしい!ありがとうございました。 –

関連する問題