Мы разрабатываем настольное приложение, которое в определенный момент отображает список из 10 000–100 000 элементов. Мы используем ListView, привязанный к ObserableCollection
проблема в том, что в некоторые моменты вам нужно добавить или удалить до 100 000 элементов в эту коллекцию одним действием. Единственный способ, которым ObservableCollection позволяет это сделать, — это добавить и удалить, которые выполняют по одному элементу за раз. Это очень неэффективно и занимает очень много времени, поскольку каждое добавление запускает событие NotifyCollectionChangedEvent, которое запускает МНОГО вещей.
Я изучал массовые поддержка обновления для ObservableCollection: NotifyCollectionChangedEventArgs имеет конструктор, который может принимать IList, но ObservableCollection теперь не предоставляет возможности его использования. Судя по всему, он был добавлен в corefx, но снова удален в новых версиях .NET??
Были попытки добавить его в .NET, но все запросы были отклонены, поскольку они все еще хотели подумать об API. Например. этот.
Я попробовал скопировать исходный код этого PR в свой локальный проект и привязать его к нашему ListView. Но это просто не работает: когда я добавляю элементы с помощью массовой вставки, представление не обновляется: и при этом я использую новый NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, itemsAdded, startIndex).
Ситуация становится хуже, когда я хочу массово удалить элементы из разных мест коллекции и передать новые. NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, itemsRemoved): я получаю исключение WinRT с недопустимым индексом, что приводит к сбою приложения. Вероятно, это вызвано тем, что эта перегрузка конструктора передает -1 в качестве начального индекса.
Похоже, ListView просто не поддерживает это или нет? Я искал какую-либо информацию по этой теме, но, похоже, ее невозможно найти. Поскольку Microsoft почти не поддерживает WinUI-3 (поверьте мне, за последние годы я пытался сообщать о нескольких ошибках на их github, но редко получал ответы), я не ожидаю от них никакой помощи, кроме: «не запланировано». «или «отставание». Я также не могу найти никого при переполнении стека, кто пробовал это. Я нашел одну (старую) статью, но этот человек пришел к такому же выводу: ListView в настоящее время ее не поддерживает.
Кто-нибудь пробовал это и нашел решение? Кто-нибудь знает кого-нибудь, кто это пробовал? Кто-нибудь работает над WinUI-3?
p.s. Я подумывал об отправке NotifyCollectionChangedAction.Reset, как предложено здесь, но это просто не работает для остальной части приложения: оно не предоставляет обработчикам событий OnCollectionChanged добавленные и удаленные элементы, поэтому многие вещи, такие как отписка обработчиков событий в удаленных элементах или отсоединение родительского элемента, не запускаются: это вызывает утечки памяти (поскольку удаленные элементы не могут быть собраны) или даже исключения (поскольку удаленные элементы по-прежнему обрабатывают события).
Подробнее здесь: https://stackoverflow.com/questions/792 ... and-delete
WinUI3 XAML ListView: массовая вставка и удаление ⇐ C#
Место общения программистов C#
-
Anonymous
1733999022
Anonymous
Мы разрабатываем настольное приложение, которое в определенный момент отображает список из 10 000–100 000 элементов. Мы используем ListView, привязанный к ObserableCollection
проблема в том, что в некоторые моменты вам нужно добавить или удалить до 100 000 элементов в эту коллекцию одним действием. Единственный способ, которым ObservableCollection позволяет это сделать, — это добавить и удалить, которые выполняют по одному элементу за раз. Это очень неэффективно и занимает очень много времени, поскольку каждое добавление запускает событие NotifyCollectionChangedEvent, которое запускает МНОГО вещей.
Я изучал массовые поддержка обновления для ObservableCollection: NotifyCollectionChangedEventArgs имеет конструктор, который может принимать IList, но ObservableCollection теперь не предоставляет возможности его использования. Судя по всему, он был добавлен в corefx, но снова удален в новых версиях .NET??
Были попытки добавить его в .NET, но все запросы были отклонены, поскольку они все еще хотели подумать об API. Например. этот.
Я попробовал скопировать исходный код этого PR в свой локальный проект и привязать его к нашему ListView. Но это просто не работает: когда я добавляю элементы с помощью массовой вставки, представление не обновляется: и при этом я использую новый NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, itemsAdded, startIndex).
Ситуация становится хуже, когда я хочу массово удалить элементы из разных мест коллекции и передать новые. NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove, itemsRemoved): я получаю исключение WinRT с недопустимым индексом, что приводит к сбою приложения. Вероятно, это вызвано тем, что эта перегрузка конструктора передает -1 в качестве начального индекса.
Похоже, ListView просто не поддерживает это или нет? Я искал какую-либо информацию по этой теме, но, похоже, ее невозможно найти. Поскольку Microsoft почти не поддерживает WinUI-3 (поверьте мне, за последние годы я пытался сообщать о нескольких ошибках на их github, но редко получал ответы), я не ожидаю от них никакой помощи, кроме: «не запланировано». «или «отставание». Я также не могу найти никого при переполнении стека, кто пробовал это. Я нашел одну (старую) статью, но этот человек пришел к такому же выводу: ListView в настоящее время ее не поддерживает.
Кто-нибудь пробовал это и нашел решение? Кто-нибудь знает кого-нибудь, кто это пробовал? Кто-нибудь работает над WinUI-3?
p.s. Я подумывал об отправке NotifyCollectionChangedAction.Reset, как предложено здесь, но это просто не работает для остальной части приложения: оно не предоставляет обработчикам событий OnCollectionChanged добавленные и удаленные элементы, поэтому многие вещи, такие как отписка обработчиков событий в удаленных элементах или отсоединение родительского элемента, не запускаются: это вызывает утечки памяти (поскольку удаленные элементы не могут быть собраны) или даже исключения (поскольку удаленные элементы по-прежнему обрабатывают события).
Подробнее здесь: [url]https://stackoverflow.com/questions/79274683/winui3-xaml-listview-bulk-insert-and-delete[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия