Domanda

Sto implementando un filtro di testo in un elenco in base a esempio di Josh Smith all'indirizzo http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox . Fondamentalmente, si imposta il filtro sulla vista di un delegato che controlla contro il testo nella casella di ricerca. Collego il filtro in questo modo:

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

In seguito, quando rinfresco l'ObjectDataProvider, il filtro è perduto. Ho notato che pickerView.View ha un codice hash diverso dopo l'aggiornamento. Sono tutti i punti di vista ricreati quando il dato si aggiorna? Vuol dire che avrei dovuto rimontare nuovamente il filtro ogni volta che io chiamo ObjectDataProvider.Refresh ()? C'è qualche modo più intelligente per installare questo filtro che non richiederebbe babysitter?

È stato utile?

Soluzione

Hai ragione nel dire che CollectionViewSource.View sarà sostituito quando CollectionViewSource.Source è impostato.

La soluzione è quella di utilizzare il CollectionViewSource .Filter evento anziché il CollectionView.Filter proprietà. Ciò restare quando la vista va via.

Si può fare questo con modifiche minime alle Josh Smith di TextSearchFilter classe:

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();
        };
    }
}

Il codice di collegamento diventa quindi:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView, SearchTextBox);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top