Строки секции карточки объектной модели
В отличие от описания схемы метаданных карточки (или справочника), в данном случае, удобнее разработать сперва объектные модели строк секций, и лишь после этого приступать к самой карточке или справочнику.
Т.к. секции могут быть нескольких типов, далее приведён пример разработки классов для строк каждого из них.
В качестве базового класса строки секции выступает класс ObjectBase
.
Плоская секция
Для примера опишем секцию, в которой содержится одно текстовое поле — Name
, а также одно ссылочное Author
, которое ссылается на сотрудника в справочнике сотрудников.
public class SampleCardStructSection : ObjectBase
{
public static readonly ObjectProperty AuthorProperty; (1)
public static readonly ObjectProperty NameProperty; (2)
public StaffEmployee Author (3)
{
get { return (StaffEmployee)base.GetValue(SampleCardStructSection.AuthorProperty); }
set { base.SetValue(SampleCardStructSection.AuthorProperty, value); }
}
public string Name
{
get { return (string)base.GetValue(SampleCardStructSection.NameProperty); }
set { base.SetValue(SampleCardStructSection.NameProperty, value); }
}
static SampleCardStructSection() (4)
{
SampleCardStructSection.AuthorProperty = ObjectProperty.Register("Author", typeof(StaffEmployee), typeof(SampleCardStructSection)); (5)
SampleCardStructSection.NameProperty = ObjectProperty.Register("Name", typeof(string), typeof(SampleCardStructSection));
}
internal SampleCardStructSection() (6)
{
}
internal SampleCardStructSection(ObjectInitializationData data) : base(data) (7)
{
}
}
1 | Вначале идет объявление всех доступных полей. Всегда типа ObjectProperty . |
2 | Рекомендуется использовать название поля из схемы метаданных с добавлением суффикса Property . |
3 | Публичные свойства для обращения получения и записи значения соответствующего поля.
Тип свойства соответствует типу поля в схеме метаданных. Для ссылочных полей тип соответствует типу сущности, на которую идет ссылка. В данном случае — это объект сотрудник. |
4 | Обязательный статический конструктор, в котором должна быть выполнена регистрация всех объявленных ранее свойств. |
5 | В метод Register передаем название поля (как в схеме метаданных), его тип (как определён выше) и тип самой секции (текущий класс). |
6 | Конструктор для новой карточки. |
При желании здесь можно добавить собственную бизнес-логику, а также проверку данных перед записью.
Коллекционная секция
Реализация объектной модели для строки секции данного типа ничем не отличается от рассмотренной ранее. Есть отличие на этапе описания секции в классе карточки (будет рассмотрено далее).
Иерархическая секция
Для такой секции свойственно наличие подчиненной секции, причем этой подчиненной секцией является сама секция. В этом основное отличие в реализации объектной модели.
public class SampleCardTreeSection : ObjectBase
{
public static ObjectProperty DescendantsProperty; (1)
public ObjectCollection<SampleCardTreeSection> Descendants (2)
{
get { return (ObjectCollection<SampleCardTreeSection>)base.GetValue(SampleCardTreeSection.DescendantsProperty); }
}
static SampleCardTreeSection()
{
SampleCardTreeSection.DescendantsProperty = ObjectProperty.Register("Descendants", typeof(ObjectCollection<SampleDescendantsSection>), typeof(SampleCardTreeSection)); (3)
}
internal SampleCardTreeSection()
{
}
internal SampleCardTreeSection(ObjectInitializationData data) : base(data)
{
}
}
1 | Объявление подчиненной секции. |
2 | Свойство, через которое будут доступны строки подчиненной секции, т.е. строки самой этой секции. |
3 | Связывание секции с соответствующим свойством.
|
В объектной модели библиотеки карточек Базовые объекты базовым классом для строк выступает класс BaseCardSectionRow
, который предоставляет некоторые дополнительные методы. Примерами методов могут быть: получение дочерней секции по идентификатору, получение значения поля с приведением к типу Guid
. Реализация объектной модели строек секций при использовании данного базового класса не изменится.