WinUI3 XAML DataGrid: массовая вставка и удалениеC#

Место общения программистов C#
Ответить
Anonymous
 WinUI3 XAML DataGrid: массовая вставка и удаление

Сообщение Anonymous »

Мы разрабатываем настольное приложение, которое в определенный момент отображает список из 10 000–100 000 элементов. Мы используем DataGrid, привязанный к ObserableCollection
проблема в том, что в некоторые моменты вам нужно добавить или удалить до 100 000 элементов в эту коллекцию одним действием. Единственный способ, которым ObservableCollection позволяет это сделать, — это добавить и удалить, которые выполняют по одному элементу за раз. Это очень неэффективно и занимает очень много времени, поскольку каждое добавление запускает событие NotifyCollectionChangedEvent, которое запускает МНОГО вещей.
Я изучал массовые поддержка обновления для ObservableCollection: NotifyCollectionChangedEventArgs имеет конструктор, который может принимать IList, но ObservableCollection теперь не предоставляет возможности его использования. Судя по всему, он был добавлен в corefx, но снова удален в новых версиях .NET??
Были попытки добавить его в .NET, но все запросы были отклонены, поскольку они все еще хотели подумать об API. Например. этот.
Я попробовал скопировать исходный код этого PR в свой локальный проект и привязать его к нашему DataGrid. Но это просто не работает: когда я добавляю элементы с помощью массовой вставки, представление не обновляется: и при этом я использую новый NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, itemsAdded, startIndex).
Ситуация становится хуже, когда я хочу массово удалить элементы из разных мест коллекции и передать новые. NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, itemsRemoved): я получаю исключение WinRT с недопустимым индексом, что приводит к сбою приложения. Вероятно, это вызвано тем, что эта перегрузка конструктора передает -1 в качестве начального индекса.
Похоже, DataGrid просто не поддерживает это или нет? Я искал какую-либо информацию по этой теме, но, похоже, ее невозможно найти. Поскольку Microsoft почти не поддерживает WinUI-3 (поверьте мне, за последние годы я пытался сообщать о нескольких ошибках на их github, но редко получал ответы), я не ожидаю от них никакой помощи, кроме: «не запланировано». «или «отставание». Я также не могу найти никого, кто пробовал это при переполнении стека.
Есть ли кто-нибудь, кто пробовал это и нашел решение? Кто-нибудь знает кого-нибудь, кто это пробовал? Кто-нибудь работает над WinUI-3?
p.s. Я подумывал об отправке NotifyCollectionChangedAction.Reset, как предложено здесь, но это просто не работает для остальной части приложения: оно не предоставляет обработчикам событий OnCollectionChanged добавленные и удаленные элементы, поэтому многие вещи, такие как отписка обработчиков событий в удаленных элементах или отсоединение родительского элемента, не запускаются: это вызывает утечки памяти (поскольку удаленные элементы не могут быть собраны) или даже исключения (поскольку удаленные элементы по-прежнему обрабатывают события).

Подробнее здесь: https://stackoverflow.com/questions/792 ... and-delete
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»