Просмотр потерян при обновлении ObjectDataProvider - PullRequest
2 голосов
/ 21 декабря 2008

Я реализую фильтр текстового поля в списке на основе примера Джоша Смита по номеру 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 ()? Есть какой-нибудь более умный способ установить этот фильтр, который не потребовал бы присмотра за детьми?

1 Ответ

4 голосов
/ 23 декабря 2008

Вы правы, говоря, что 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);
...