2016-08-02 92 views
1

我有一個AutoSuggestBox,在textchanged事件中,每次更改文本時都會設置ListView的itemsSource。在ListView中高效實現搜索UWP

 var box = sender as AutoSuggestBox; 
     var searchString = box.Text; 
     labelFolder.ItemsSource = AllTags.Where(p => p.NAME.Contains(searchString)); 

這是一個很好的做法嗎?如果沒有,是否有任何有效的方法來做同樣的事情?

回答

1

如果你的AllTags將包含成千上萬的元素 - 我想這將是低效的。另外,在鍵盤上每敲擊一次,TextChanged事件可能會啓動,並且數據重新加載非常頻繁,這可能會減慢您的應用程序。 在這種情況下查看Reactive Extensions是個好主意。使用Rx,用戶輸入速度非常快,並且可以輕鬆延遲數據刷新,例如。 Where結果的前20個元素。

var searchObservable = Observable.FromEventPattern(s => box.TextChanged += s, s => box.TextChanged -= s) 
.Throttle(TimeSpan.FromMilliseconds(400)) 
.Select(result => 
    { 
     var textBox = result.Sender as AutoSuggestBox; 
     return textBox.Text; 
    } 
); 

searchObservable 
.DistinctUntilChanged() 
.ObserveOnDispatcher() 
.Subscribe(searchString => 
    { 
      //Select elements from 'AllTags' here, this code will be launched with 400ms delay (throttle) when user is typing fast. 
    } 

請注意,這個例子非常一般,但您可以基於它。

乍一看,Rx看起來很困難,但有很多關於它的topicstutorials