Повышение производительности INotifyPropertyChanged, затрагивающее все элементы в коллекции

У меня есть ObservableCollection, который используется как ItemsSource для Xamarin Forms DataGrid. Каждая из моделей представлений в коллекции имеет наблюдаемое свойство IsSelected, привязанное к Switch в шаблоне строки сетки данных. В этой сетке данных может быть что-то до ~ 20 тыс. строк.

Есть кнопки «Выбрать все» и «Выбрать ничего», которые делают то, что вы ожидаете: они устанавливают это свойство в соответствующее значение для каждого элемента в коллекции. Для больших коллекций это занимает несколько секунд, и причина заключается в обработке всех этих уведомлений об изменении свойств для синхронизации пользовательского интерфейса.

Есть ли способ либо группировать эти уведомления об изменениях, либо приостанавливать их и обновлять пользовательский интерфейс по старинке, либо делать что-то еще, что улучшит производительность? Методы, которые я видел для пакетной обработки уведомлений PropertyChanged, включают объединение нескольких изменений одного и того же свойства в одном и том же объекте, что не является моей проблемой.

«до ~ 20 тыс. строк» ​​- я настоятельно рекомендую пересмотреть это. Действительно ли пользователю мобильного устройства понадобится 20 тысяч строк данных? Можно хотя бы виртуализировать отображение, чтобы обновлялись только видимые строки?

Jason 10.12.2020 14:31

@Jason Я считаю, что пользователю в этом проблемном домене нужен доступ к своим данным, когда он находится в поле, да. "Виртуализация дисплея", я думаю, потребует модификации стороннего плагина DataGrid, и это в принципе возможно, мне было интересно, есть ли для этого общий шаблон.

Graham Lee 10.12.2020 15:11

если это действительно необходимо, я бы посмотрел на коммерческий компонент, поддерживающий виртуализацию, а не на бесплатный, который вы используете.

Jason 10.12.2020 15:14

@ Джейсон Я уже спрашивал, есть ли на это бюджет, и мне сказали, что нет.

Graham Lee 10.12.2020 15:29
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
За пределами сигналов Angular: Сигналы и пользовательские стратегии рендеринга
TL;DR: Angular Signals может облегчить отслеживание всех выражений в представлении (Component или EmbeddedView) и планирование пользовательских...
Sniper-CSS, избегайте неиспользуемых стилей
Sniper-CSS, избегайте неиспользуемых стилей
Это краткое руководство, в котором я хочу поделиться тем, как я перешел от 212 кБ CSS к 32,1 кБ (сокращение кода на 84,91%), по-прежнему используя...
1
4
118
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Опция 1:

Мы всегда используем разбиение на страницы, если нам нужно загрузить большое количество элементов. В вашем случае вы можете обновить следующие десять или более элементов IsSelected, прежде чем мы добавим их в ItemsSource.

Вариант 2:

Вы можете просто запустить несколько методов одновременно. Чтобы вы могли обновить значение IsSelected несколькими способами (в каждом методе вы могли обновить 1000 или более элементов)

// this process run synchronously.
Task.Run(() =>
{
// call your methods
MyFunction1(); // update 1-1000
MyFunction2(); // update 1001-2000 
});
// this process doesn't wait for function execution,it will run Asynchronous way.use this if you dont want to use function return value;
Task.Factory.StartNew(MyFunction1);
Task.Factory.StartNew(MyFunction2);

Оба процесса помогут вам неблокировать пользовательский интерфейс.

@Graham Lee Если ответ полезен, примите его как ответ (нажмите «✔» в верхнем левом углу этого ответа), это поможет другим, у кого есть похожая проблема.

Lucas Zhang 14.12.2020 08:18

Другие вопросы по теме

Похожие вопросы

Как разбить IList<T> на сегменты размером N, не создавая копий и не выделяя памяти?
Как быстро добавить число в середину строки?
Более быстрые в вычислительном отношении альтернативы для вычисления новой переменной на основе нескольких столбцов из двух больших фреймов данных в R
Причина высокой задержки при использовании ctypes python во время прерываний процесса
Добавление аргументов вершин («тип») в список объектов igraph
Почему 0/1 быстрее, чем False/True для этого сита в PyPy?
Какова оптимальная структура данных для хранения объектов со строковым ключом и логическим вспомогательным значением?
Джулия: БЫСТРЫЙ способ расчета наименьших расстояний между двумя наборами точек
Каков самый быстрый способ суммировать две строки, состоящие только из чисел, но без предварительного преобразования каждой из них в int?
Нахождение самого длинного интервала с уменьшением значения