AutoCompleteBox с проблемой производительности при использовании большого источника данных - PullRequest
0 голосов
/ 17 февраля 2012

У меня есть источник данных (типа List) с около 30 000 записей.

public class LocationItem
{
    public string Name { get; set; };
    public double Latitude { get; set; };
    public double Longitude { get; set; };
    public double Height { get; set; };
}

После привязки этого источника к моему AutoCompleteBox каждая введенная буква требует около 1-3 секунд для фильтрации. Тип фильтра - «Пользовательский». Мой метод фильтрации не является узким местом - я проверил это с помощью класса «Секундомер» и профилировщика производительности. Фильтрация начинается не раньше четвертого символа.

Единственная альтернатива, чтобы быть немного быстрее, это использовать событие TextChanged вместо реализованного поведения фильтра. В событии TextChanged я фильтрую исходный источник данных (Linq) и привязываю только отфильтрованное подмножество к AutoCompleteBox.

Есть ли какой-то другой способ повысить производительность? Или как лучше привязать источник данных (с тысячами записей) к AutoCompleteBox с функциональностью фильтра?

С уважением, Дэнни

Ответы [ 2 ]

0 голосов
/ 29 марта 2012
void SetData()
{
    ...
    autoCompleteBox = Data.GetRange(0, 30);
    ...
}

void autoCompleteBox_DropDownOpened(object sender, RoutedPropertyChangedEventArgs<bool> e)
{
    autoCompleteBox.ItemsSource = Data;
}
0 голосов
/ 18 февраля 2012

Было бы лучше, если бы вы выполняли асинхронную фильтрацию.
Вот учебник http://www.silverlightshow.net/items/Using-the-AutoCompleteBox.aspx для использования AutoCompleteBox в Silveright. Есть пример асинхронной фильтрации. Пример с веб-сервисом, но вы можете заменить его на локальный сервис, который загружает ваши данные из файла или коллекции, которую вы уже загрузили.

...