Вопрос

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

Это было полезно?

Решение

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

Решение состоит в том, чтобы использовать Источник CollectionViewSource.Фильтр событие вместо Просмотр коллекции.Фильтр собственность.Это останется, когда ваш Просмотр исчезнет.

Вы можете сделать это с минимальными изменениями в книге Джоша Смита Поисковый фильтр 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top