Esempio n. 1
0
        void ReactiveSearch()
        {
            //1. Create Observable from TextChanged event of the SearchBox
            //2. Select the text that was entered
            //3. Keep only strings with >3 characters
            //4. Take only if the time passed > 0.5 sec
            //5. Take only if it's not the same string again
            //6. Asynchronically call the Search service
            //7. Discard results if another search was requested
            //8. Show the results inside the SearchResult listbox

            var client = new SearchServiceClient();

            _subscription =
               Observable.FromEventPattern(SearchBox, nameof(SearchBox.TextChanged))
                   .Select(_ => SearchBox.Text)
                   .Where(txt => txt.Length >= 3)
                   .Throttle(TimeSpan.FromSeconds(0.5))
                   .DistinctUntilChanged()
                   .Select(txt => _client.SearchAsync(txt))
                   .Switch()
                   .ObserveOnDispatcher()
                   .Subscribe(
                       results => SearchResults.ItemsSource = results,
                       err => { Debug.WriteLine(err); },
                       () => { /* OnCompleted */ });

            #region clearing results for short search terms
            Observable.FromEventPattern(SearchBox, "TextChanged")
                    .Select(_ => SearchBox.Text)
                    .Where(txt => txt.Length < 3)
                    .ObserveOnDispatcher()
                    .Subscribe(
                        results => SearchResults.ItemsSource = Enumerable.Empty<string>(),
                        err => { Debug.WriteLine(err); },
                        () => { /* OnCompleted */ });
            #endregion
        }