Pregunta

estoy poniendo en práctica un filtro de texto en una lista basada en el ejemplo de Josh Smith en http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox . Básicamente, se establece el filtro en la vista a un delegado que comprueba contra el texto en el cuadro de búsqueda. Conecto el filtro de esta manera:

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

Más tarde, cuando se actualizan los ObjectDataProvider, se pierde el filtro. Me he dado cuenta de que pickerView.View tiene un código hash diferente después de la actualización. Están todas las vistas a crear cuando los datos se actualiza? ¿Eso significa que debería volver a colocar el filtro de nuevo cada vez que llamo ObjectDataProvider.Refresh ()? ¿Hay alguna manera más inteligente para instalar este filtro que no requiere cuidado de niños?

¿Fue útil?

Solución

Tiene razón al decir que CollectionViewSource.View será reemplazado cuando se establece CollectionViewSource.Source.

La solución es utilizar la CollectionViewSource .Filter evento en lugar de la CollectionView.Filter propiedad. Esto se quedará cuando su vista se va.

Usted puede hacer esto con cambios mínimos a Josh Smith clase 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();
        };
    }
}

Su código de conexión se convierte en:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView, SearchTextBox);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top