2008-12-21 52 views
2

我在列表上實現了基於Josh Smith示例的列表上的文本框過濾器,其格式爲http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox。基本上,它將視圖上的過濾器設置爲一個代理,用於檢查搜索框中的文本。我勾了過濾器,像這樣:刷新時丟失視圖數據提供者

var pickerView = FindResource("sortedRulesView") as CollectionViewSource; 
new TextSearchFilter(pickerView.View, SearchTextBox); 

後來,當我刷新ObjectDataProvider的,過濾器會丟失。我注意到pickerView.View在刷新後有一個不同的哈希碼。數據刷新時是否重新創建了所有視圖?這是否意味着我應該再次重新附加過濾器,每當我調用ObjectDataProvider.Refresh()?有沒有更聰明的方法來安裝這個不需要保姆的過濾器?

回答

4

你說得對,當設置CollectionViewSource.Source時,CollectionViewSource.View將被替換。

解決方法是使用CollectionViewSource.Filter事件而不是CollectionView.Filter屬性。當視圖消失時,這將會繼續存在。

你可以用最小的變化約什·史密斯的TextSearchFilter類做到這一點:然後

public class TextSearchFilter 
{ 
    public TextSearchFilter( 
     CollectionViewSource filteredView, 
     TextBox textBox) 
    { 
     string filterText = ""; 

     filteredView.Filter += delegate(object obj, FilterEventArgs e)     
     { 
      if(String.IsNullOrEmpty(filterText)) 
       e.Accepted = true; 

      string str = e.Item as string; 
      if(String.IsNullOrEmpty(str)) 
       e.Accepted = false; 

      int index = str.IndexOf(
       filterText, 
       0, 
       StringComparison.InvariantCultureIgnoreCase); 

      e.Accepted = index > -1; 
     };   

     textBox.TextChanged += delegate 
     { 
      filterText = textBox.Text; 
      filteredView.View.Refresh(); 
     }; 
    } 
} 

你聯播代碼變爲:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource; 
new TextSearchFilter(pickerView, SearchTextBox); 
+0

謝謝,這個完美的作品和有意義。 – Yostage 2008-12-23 04:12:55