Просмотр теряется при обновлении ObjectDataProvider
-
23-08-2019 - |
Вопрос
Я внедряю фильтр текстового поля в списке, основанный на примере Джоша Смита по адресу 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);