Pergunta

Estou implementando um filtro de caixa de texto em uma lista com base no exemplo de Josh Smith em http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox . Basicamente, ele define o filtro no fim de um delegado que os controlos contra o texto na caixa de pesquisa. I ligar o filtro assim:

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

Mais tarde, quando eu atualizar a ObjectDataProvider, o filtro está perdido. Tenho notado que pickerView.View tem um hashcode diferente após a atualização. São todos os pontos de vista recriado quando a atualizações de dados? Isso significa que eu deveria recolocar o filtro novamente sempre que eu chamo ObjectDataProvider.Refresh ()? Existe alguma maneira mais inteligente para instalar este filtro que não exigiria babá?

Foi útil?

Solução

Você tem razão em dizer que CollectionViewSource.View será substituído quando CollectionViewSource.Source está definido.

A solução é usar a CollectionViewSource evento em vez do .filter CollectionView.Filter propriedade. Isso vai ficar em torno de quando o seu Ver vai embora.

Você pode fazer isso com alterações mínimas de Josh Smith 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();
        };
    }
}

O seu código de conexão torna-se então:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView, SearchTextBox);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top