Я работаю в архитектурной фирме и создаю плагин для программы 3D-моделирования, чтобы помочь дизайну. У меня есть класс Building и класс Floor . Здание содержит ссылку на коллекцию этажей FloorList . Я пытаюсь выяснить, на чем основывать коллекцию FloorList , чтобы я мог минимизировать объем работы, которую мне нужно сделать, чтобы создать интерфейс для редактирования коллекции.
Коллекция Этаж представляет собой серию этажей зданий, уложенных друг на друга. Каждое Этаж имеет свойство Floor.Height , предназначенное для чтения и записи, и свойство Floor.Elevation , которое доступно только для чтения и устанавливается путем суммирования высот этажа ниже ток этаж . Таким образом, всякий раз, когда Floor добавляется, удаляется, перемещается или изменяется в коллекции, свойства Floor.Elevation необходимо обновлять.
Кроме того, я хочу создать пользовательский интерфейс для редактирования этой коллекции. Я думал об использовании элемента управления DataGrid , где каждый Этаж указан со своими Высота и другими свойствами в качестве строки элемента управления. Пользователь должен иметь возможность добавлять, удалять и переупорядочивать этажи с помощью элемента управления. Я бы хотел, чтобы это было максимально простым и гибким. Это означает, что я хотел бы просто иметь возможность привязать коллекцию этажей к DataGrid и иметь заполненные столбцы DataGrid на основе свойств Floor учебный класс. Если возможно, я бы хотел использовать встроенный интерфейс добавления / удаления пользовательского интерфейса элемента управления DataGrid без необходимости возиться с настройкой связки событий между моей коллекцией и DataGrid .
Чтобы еще больше усложнить ситуацию в будущем, я должен иметь возможность позволить пользователю динамически добавлять пользовательские свойства в Этажи , которые я хочу, чтобы они могли видеть и редактировать в DataGrid . Я думаю, что в конечном итоге я сделаю это, если Floor class реализует IExtenderProvider . Таким образом, в конечном итоге DataGrid будет выглядеть примерно так:
Initial Properties Future Custom User Properties
Height Elevation ProgramType UnitType UnitCount
15' 70' Residential Luxury 5
15' 55' Residential Luxury 5
15' 40' Residential Budget 10
20' 20' Retail N/A 2
20' 0' Retail N/A 3
Мой вопрос сейчас заключается в том, на чем я должен основывать свою коллекцию FloorList , чтобы использовать эту функцию? Варианты, которые я рассматриваю, следующие:
1) Наследовать от Списка (Этаж)
- Такие методы, как Add / Remove, не являются vitrual, и поэтому я не могу не переопределить их для обновления высот
2) Реализация IList (Этаж)
Событие OnChange не встроено, поэтому при изменении списков DataGrid не будет обновляться (я думаю?)
Я думаю, что это, вероятно, лучший вариант, но что мне нужно сделать, чтобы изменения в коллекции FloorList или DataGrid синхронизировались друг с другом?
3) Наследование от BindingList (Floor)
- Такие методы, как Добавить / Удалить, не являются виртуальными, поэтому я не могу изменить их для обновления высот этажа.
4) Реализация IBindingList
- IBindinglist не является универсальным, и я хочу, чтобы моя коллекция содержала Floor objects