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