Обновление ObservableCollections в приложениях WPF MVVM - PullRequest
0 голосов
/ 01 марта 2012

Я пытаюсь реализовать отображение 'message / comments'.

Представление состоит из ListBox, который связан с ObservableCollection (это сообщения).Я также имею двустороннюю привязку SelectedItem ListBox.

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

Все в свойствах обновляется нормально.Когда эти списки обрабатываются, фекалии попадают в фанат.

каждый раз, когда выбирается новая запись, я должен делать «.Insert ()», а не «.Add ()».это имеет значительные [неприемлемые] потери производительности даже при обработке нескольких тысяч сообщений и нескольких сотен комментариев.

Я хотел бы сделать это: 'PostsCollection = newObservableCollectionWithPostsAndComments', но это приводит к обновлению всего списка и к SelectedItem длястать невыбранным.

Как вы должны обрабатывать динамически вставляемые элементы в ObservableCollection <>, которая привязана к ListBox, без перерисовки Listbox?

* помимо отображаемых новых элементов

РЕДАКТИРОВАТЬ: У меня небольшое ощущение, что я сделал ошибку кодирования, но я не могу показать весь исходный код здесь.Если бы вы могли сказать мне, возможно ли то, что я хочу, это было бы здорово.

1 Ответ

0 голосов
/ 26 апреля 2017

Если я правильно понимаю вашу проблему, у вас есть проблемы со вставкой элементов в коллекцию Observable.Действительно, после каждой вставки коллекция вызывает событие изменения коллекции, и пользовательский интерфейс перерисовывается.

Один из способов решить эту проблему - извлечь новый класс из Observable Collection, например ObservableCollectionEx, с помощью таких методов, как AddRange (IEnumerable items), в котором вы добавите несколько элементов в коллекцию, но вызовете только одно событие изменения коллекции.Пример приведен по ссылке ниже

http://xcalibursystems.com/2013/12/making-a-better-observablecollection-part-1-extensions/

Другой способ, возможно, не совсем чистый, - создать новую коллекцию ObservableCollection с результирующим набором элементов и назначить ее свойству, которомуItemsSource ListBox связывает.Также не забудьте вызвать событие PropertyChanged для этого свойства, если вы реализуете INotifyPropertyChanged

...