Строки секции карточки объектной модели

В отличие от описания схемы метаданных карточки (или справочника), в данном случае, удобнее разработать сперва объектные модели строк секций, и лишь после этого приступать к самой карточке или справочнику.

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

В качестве базового класса строки секции выступает класс 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 Связывание секции с соответствующим свойством.

SampleDescendantsSection — некая секция, которая в схеме метаданных карточки подчинена секции SampleCardTreeSection.

В объектной модели библиотеки карточек Базовые объекты базовым классом для строк выступает класс BaseCardSectionRow, который предоставляет некоторые дополнительные методы. Примерами методов могут быть: получение дочерней секции по идентификатору, получение значения поля с приведением к типу Guid. Реализация объектной модели строек секций при использовании данного базового класса не изменится.