У меня есть ObservableCollection
, который используется как ItemsSource
для Xamarin Forms DataGrid. Каждая из моделей представлений в коллекции имеет наблюдаемое свойство IsSelected
, привязанное к Switch
в шаблоне строки сетки данных. В этой сетке данных может быть что-то до ~ 20 тыс. строк.
Есть кнопки «Выбрать все» и «Выбрать ничего», которые делают то, что вы ожидаете: они устанавливают это свойство в соответствующее значение для каждого элемента в коллекции. Для больших коллекций это занимает несколько секунд, и причина заключается в обработке всех этих уведомлений об изменении свойств для синхронизации пользовательского интерфейса.
Есть ли способ либо группировать эти уведомления об изменениях, либо приостанавливать их и обновлять пользовательский интерфейс по старинке, либо делать что-то еще, что улучшит производительность? Методы, которые я видел для пакетной обработки уведомлений PropertyChanged, включают объединение нескольких изменений одного и того же свойства в одном и том же объекте, что не является моей проблемой.
@Jason Я считаю, что пользователю в этом проблемном домене нужен доступ к своим данным, когда он находится в поле, да. "Виртуализация дисплея", я думаю, потребует модификации стороннего плагина DataGrid, и это в принципе возможно, мне было интересно, есть ли для этого общий шаблон.
если это действительно необходимо, я бы посмотрел на коммерческий компонент, поддерживающий виртуализацию, а не на бесплатный, который вы используете.
@ Джейсон Я уже спрашивал, есть ли на это бюджет, и мне сказали, что нет.
Опция 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 Если ответ полезен, примите его как ответ (нажмите «✔» в верхнем левом углу этого ответа), это поможет другим, у кого есть похожая проблема.
«до ~ 20 тыс. строк» - я настоятельно рекомендую пересмотреть это. Действительно ли пользователю мобильного устройства понадобится 20 тысяч строк данных? Можно хотя бы виртуализировать отображение, чтобы обновлялись только видимые строки?