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
значения по разному DataTemplate
s, тогда WPF будет неявно устанавливать их для соответствующих объектов типа данных, когда он их визуализирует.
Таким образом, вы можете поместить все свои различные типы данных в одну коллекцию. Затем вы можете добавить свой первый тип и ждать сколько угодно, добавить другой тип или любой другой порядок, который вам нравится.
ОБНОВЛЕНИЕ >>>
В ответ на изменения в вашем вопросе я не совсем понимаю причину, по которой вы пытаетесь использовать INotifyPropertyChanged
интерфейс для отображения элементов, тип по типу. Если у вас есть коллекция базовых классов, о которой я упоминал выше, вы просто сначала добавляете экземпляры первого типа в коллекцию, чтобы они сначала отображались. Когда вы хотите, чтобы появился следующий тип, просто добавьте их в коллекцию, затем они появятся и так далее. ObservableCollection
позаботится об этом.