2

我想在您輸入的功能(如一個在默認的電子郵件應用程序搜索)實現搜索 - 我有一個列表框有說50個項目 - 結合到具有字符串字段一個類的對象的每個項目...我想搜索和顯示其在搜索框中的文本在其字符串領域的一個項目 - 本作中的文本框的用戶密鑰......試了幾個辦法 - >如何在輸入時提高搜索的性能?

1 >>使用一個CollectionViewSource
- 綁定一個CollectionViewSource從所有項目的DB
- 綁定列表框到CollectionViewSource
- 設置CollectionViewSource的篩選器屬性 - 到其功能,搜尋SEARCH_TERM_EXAMPLES的T在搜索框中的項目和設置e.Accepted - 在每個關鍵事件
- 過濾工作正常,但其緩慢的50項:( - 猜測過濾器採取每個項目和檢查是否設置e.Accepted屬性到負荷,但真正
....一個DB調用似乎是一個大量的處理決定由CollectionViewSource

2 >>過濾@ DB水平
在文件管理器,以DISPLY哪個元素 - 上KEYUP - 發送在搜索框中的視圖模型的文本,其中一個函數返回一個對象的ObservableCollection其中有搜索字符串
- 的ObservableCollection綁定到列表框
....沒有太多的處理@頂層,但每個按鍵上有多個數據庫調用 - 仍然很慢,但只比方法一更快點

有沒有其他方法可以推薦?或者有什麼建議可以進一步優化上述方法? - 任何調整,以使搜索順利運作?

首次進入移動開發:)提前...感謝名單:)

+0

在這裏你可以看看樣品 http://stackoverflow.com/questions/5782585/filtering-an-observablecollection – JSJ

+0

您好我已經做到了。請參見方法1 ...當時想知道如果有人有任何想法來提高性能...這可以與一些項目確定,但明顯緩慢與50項... – chancyjohn

+0

然後我認爲你應該去只讀項目。這將無法提高性能。 – JSJ

回答

1

您可以通過延遲x毫秒的搜索行動進一步優化搜索過程,以允許用戶繼續搜索條件的寫作。這樣,每個新類型的字符都會將搜索動作延遲xxx毫秒,直到觸發動作的最後一個字符爲止,您只需使用一個電話而不是10個電話即可獲得更好的性能。從技術上講,你可以通過使用Timer類來實現。 在這裏您可以找到一個示例源代碼示例,顯示如何實現此目的。

private void txtSearchCriteria_TextChanged(object sender, TextChangedEventArgs e) 
    { 
     if (txtSearchCriteria.Text == "Search ...") 
      return; 

     if (this.deferredAction == null) 
     { 
      this.deferredAction = DeferredAction.Create(() => ApplySearchCriteria()); 
     } 

     // Defer applying search criteria until time has elapsed. 
     this.deferredAction.Defer(TimeSpan.FromMilliseconds(250)); 
    } 


    private DeferredAction deferredAction; 


    private class DeferredAction 
    { 
     public static DeferredAction Create(Action action) 
     { 
      if (action == null) 
      { 
       throw new ArgumentNullException("action"); 
      } 

      return new DeferredAction(action); 
     } 

     private Timer timer; 

     private DeferredAction(Action action) 
     { 
      this.timer = new Timer(new TimerCallback(delegate 
      { 
       Deployment.Current.Dispatcher.BeginInvoke(action); 
      })); 
     } 

     public void Defer(TimeSpan delay) 
     { 
      // Fire action when time elapses (with no subsequent calls). 
      this.timer.Change(delay, TimeSpan.FromMilliseconds(-1)); 
     } 
    } 

    public void ApplySearchCriteria() 
    { 
     ICollectionView dataView = this.ViewSource.View; 

     string criteria = this.txtSearchCriteria.Text; 
     string lowerCriteria = criteria.ToLower(); 
     using (dataView.DeferRefresh()) 
     { 
      Func<object, bool> filter = word => 
      { 
       bool result = word.ToString().ToLower().StartsWith(lowerCriteria); 
       return result; 
      }; 

      dataView.Filter = l => { return filter.Invoke(l); }; 
     } 

     this.lstWords.ItemsSource = dataView;      
     if (this.lstWords.Items.Count != 0) 
     { 
      this.lblError.Visibility = Visibility.Collapsed; 
     } 
     else 
     { 
      this.lblError.Visibility = Visibility.Visible; 
     } 
    } 
+0

Thanx :) ...好的 – chancyjohn