Просмотр потерян при обновлении ObjectDataProvider

Я реализую фильтр текстового поля для списка на основе примера Джоша Смита по адресу http://joshsmithonwpf.wordpress.com/2007/06/12/searching-for-items-in-a-listbox. По сути, он устанавливает фильтр в представлении для делегата, который проверяет текст в поле поиска. Подключаю фильтр так:

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

Позже, когда я обновляю ObjectDataProvider, фильтр теряется. Я заметил, что pickerView.View после обновления имеет другой хэш-код. Все ли представления воссоздаются при обновлении данных? Означает ли это, что мне нужно снова подключать фильтр всякий раз, когда я вызываю ObjectDataProvider.Refresh ()? Есть ли более разумный способ установить этот фильтр, при котором не потребуется присмотр за детьми?


person Yostage    schedule 21.12.2008    source источник


Ответы (1)


Вы правы, говоря, что CollectionViewSource.View будет заменен при установке CollectionViewSource.Source.

Решение состоит в использовании CollectionViewSource.Filter вместо события CollectionView.Filter собственности. Это останется, когда ваш вид исчезнет.

Вы можете сделать это с минимальными изменениями в 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();
        };
    }
}

Тогда ваш код подключения станет:

var pickerView = FindResource("sortedRulesView") as CollectionViewSource;
new TextSearchFilter(pickerView, SearchTextBox);
person Robert Macnee    schedule 23.12.2008