Программно многоселективное обновление происходит медленно в списке - PullRequest
2 голосов
/ 22 февраля 2010

Я пытаюсь программно обновить выбранные элементы в списке с расширенным режимом выбора.
Вот как я это делаю:

foreach (var selectedItem in ItemsForSelection)
{
  _myList.SelectedItems.Add(selectedItem);
}

Моя проблема в том, что когда количество выбранных элементов велико, обновление происходит очень медленно.
Корень проблемы в том, что список не выводится из MultiSelector, который можно настроить для выполнения быстрого массового обновления, используя методы BeginUpdateSelectedItems и EndUpdateSelectedItems.
Есть ли способ получить аналогичный результат в списке?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2010

Есть ли в ListBox метод BeginUpdate и EndUpdate, доступный ...

_myList.BeginUpdate();
foreach (var selectedItem in ItemsForSelection)
{
  _myList.SelectedItems.Add(selectedItem);
}
_myList.EndUpdate();

Предполагается, что _myList является ListBox ... Пара для методов Begin / End Update замораживает сообщение WM_PAINT и, соответственно, размораживает его, делая его быстрым и быстрым.

0 голосов
/ 08 июля 2010

Существует SetSelectedItems (IEnumerable), доступный в ListBox, который вы можете использовать. Эта функция оборачивает изменения выбора в SelectionChange.Begin / End (к сожалению, конечно, доступны только для внутреннего использования), что должно привести к выходу только одного события изменения выбора.

Обратите внимание, что SetSelectedItems защищен, поэтому вам придется использовать свою собственную производную ListBox для его вызова. Странный выбор, тот.

0 голосов
/ 22 февраля 2010

После добавления части элементов попробуйте накачать диспетчера, вставив рамку диспетчера в диспетчер.

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherframe.aspx

...