2008-12-21 4 views
2

J'implémente un filtre de zone de texte dans une liste basée sur l'exemple de Josh Smith au http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox. Fondamentalement, il définit le filtre sur la vue à un délégué qui vérifie le texte dans la zone de recherche. J'accroche le filtre comme ceci:Afficher perdu lors de l'actualisation ObjectDataProvider

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

Plus tard, quand j'actualiser la ObjectDataProvider, le filtre est perdu. J'ai remarqué que pickerView.View a un hashcode différent après l'actualisation. Toutes les vues sont-elles recréées lorsque les données sont actualisées? Cela signifie-t-il que je devrais réattacher le filtre à chaque fois que j'appelle ObjectDataProvider.Refresh()? Y at-il une façon plus intelligente d'installer ce filtre qui ne nécessite pas de baby-sitting?

Répondre

4

Vous avez raison de dire que CollectionViewSource.View sera remplacé lorsque CollectionViewSource.Source est défini.

La solution consiste à utiliser l'événement CollectionViewSource.Filter au lieu de la propriété CollectionView.Filter. Cela va rester quand votre vue disparaît.

Vous pouvez le faire avec un minimum de changements à la classe de Josh Smith 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(); 
     }; 
    } 
} 

Votre code de branchement devient alors:

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

Merci, cela fonctionne parfaitement et est logique. – Yostage

Questions connexes