ListBox на холсте: наложение нескольких холстов или использование CompositeCollection?

В wpf с mvvm я использую ListBox с Canvas в качестве ItemsPanelTemplate и DataTemplates для настройки внешнего вида.
Я хотел бы повысить производительность, добавив сначала все элементы типа 1 к чертежу, а затем все элементы типа 2.
Я мог бы создать два ListBox, оба с Canvas в качестве ItemsPanelTemplate, и они были бы оверлеями.
Панорамирование и прокрутка могут быть синхронизированы с помощью привязок.
Таким образом, я могу вызывать PropertyChanges для обоих списков независимо друг от друга.

Вопрос: есть ли у вас опыт, хорошо ли накладывать холсты для работы?

Я не уверен, возможно ли это также с помощью CompositeCollection для ItemsSource одного ListBox. Или в этом отношении дать обоим типам общий подкласс и остаться с ObservableCollection.

Вопрос: считаете ли вы, что каким-то образом списку с CompositeCollection можно дать отдельные PropertyChanges для разных частей Коллекции?

РЕДАКТИРОВАТЬ:
Предположим, у меня есть множество точек, линий, меток для холста, каждый из которых имеет свой тип, но с общим базовым типом. Я выбираю DataTemplate, используя DataType: DataType="{x:Type my:Point}", DataType="{x:Type my:Line}" и т.п.
Сначала как можно быстрее я хочу, чтобы пользователь видел строки. Я поднимаю PropertyChanged("Lines") и ListBox+Canvas для строк виден.
В фоновом режиме я поднимаю PropertyChanged("Points") и ListBox2+Canvas2 для точек виден.
Когда сделано в другой фоновый работник, я поднимаю PropertyChanged("Labels") и ListBox3+Canvas3 для меток виден.

1 ответ

Решение

Существует гораздо более простое решение с использованием базового объектно-ориентированного программирования. Создайте базовый тип данных и сделайте так, чтобы все ваши объекты данных расширялись от него. Он может быть пустым, но если ничего другого, вы можете реализовать INotifyPropertyChanged в этом, так что вам не нужно в каждом из других типов данных.

Затем вы просто добавляете свойство типа ObservableCollection<BaseClass> к вашей модели представления или кода и данные связывают это с ListBox.ItemsSource имущество. Пока вы не установите x:Key значения по разному DataTemplates, тогда WPF будет неявно устанавливать их для соответствующих объектов типа данных, когда он их визуализирует.

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


ОБНОВЛЕНИЕ >>>

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

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