Voir perdu quand ObjectDataProvider rafraîchissant
-
23-08-2019 - |
Question
Je suis mise en œuvre d'un filtre sur une zone de texte liste basée sur l'exemple de Josh Smith http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox . En gros, il met le filtre en vue d'un délégué qui vérifie contre le texte dans la zone de recherche. J'accroche le filtre comme ceci:
var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView.View, SearchTextBox);
Plus tard, quand j'actualiser la ObjectDataProvider, le filtre est perdu. Je l'ai remarqué que pickerView.View a un autre hashcode après l'actualisation. Sont toutes les vues recréés lorsque les données rafraichit? Est-ce que cela signifie que je dois remettre en place le filtre à chaque fois que je l'appelle ObjectDataProvider.Refresh ()? Yat-il une façon plus intelligente d'installer ce filtre qui ne nécessite pas de baby-sitting?
La solution
Vous avez raison de dire que CollectionViewSource.View sera remplacé lorsque CollectionViewSource.Source est réglé.
La solution est d'utiliser le CollectionViewSource l'événement de .filter au lieu du propriété de CollectionView.Filter. Cela collera autour quand votre vue va.
Vous pouvez le faire avec un minimum de changements à Josh Smith classe de 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);