Я создал простое, но максимально эффективное решение для вашей проблемы:
public class MyCollection<T> : ObservableCollection<T>
{
private bool _isInEditMode = false;
public void BeginEdit()
{
_isInEditMode = true;
}
public void CommitEdit()
{
_isInEditMode = false;
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
{
if (_isInEditMode == false)
{
base.OnCollectionChanged(e);
}
}
}
Класс my collection предотвращает события, изменяющие коллекцию, пока вы находитесь в режиме редактирования.Запустите «BeginEdit» перед очисткой элементов.Затем добавьте свои новые предметы.Когда вы закончите, используйте «CommitEdit», и представление обновится только один раз.
Если вы проверили его с помощью простого списка, где я добавил 1 000 000 строковых элементов.Попробуйте это.Это забавно:)
private void Button_Click(object sender, RoutedEventArgs e)
{
MyCollection<string> list = testBox.ItemsSource as MyCollection<string>;
//list.BeginEdit();
for (int i = 0; i < 1000000; i++)
{
list.Add("test " + i);
}
list.CommitEdit();
}
Удалите // из list.BeginEdit () и посмотрите разницу.Его примерно 15 секунд против <1 секунды. </p>
Привет,
Ян