Конвертация значения элемента управления

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

Чтобы внедрить функцию конвертации, нужно:
  1. Указать в описателе свойства Binding название функции конвертации:

    • в текстовом описателе — в атрибуте BindingConverter:

       <Property Type="Binding" BindingConverter="SuperConverter" />
    • в бинарном описателе — в методе GetBindingLoader:

      var bindingProperty = PropertyFactory.GetBindingProperty();
      bindingProperty.GetBindingLoader = (() => new SimpleBindingLoader
      {
          ConverterType = "SuperConverter"
      });
  2. Добавить класс конвертер в серверное расширение.

    Класс конвертера является производным от BaseBindingConverter, в котором переопределяется метод ConvertForDisplay. Данный метод должен привести значение элемента управления к требуемому виду.

    Следующий код демонстрирует пример класса конвертера, в котором значение элемента управления преобразуется с использованием функции ConvertForDisplay.

    internal class SuperConverter : BaseBindingConverter
    {
        public SuperConverter(IServiceProvider serviceProvider) (1)
            : base(serviceProvider, "SuperConverter")
        {
        }
    
        public override BindingResult ConvertForDisplay(ControlContext controlContext, Binding binding, BindingResult bindingResult) (2)
        {
            var data = SuperMethod(bindingResult.Value); (3)
    
            return bindingResult.Clone(data); (4)
        }
    }
    1 В конструктор базового класса должно быть передано название конвертера, которое указано данных свойства.
    2 Метод ConvertForDisplay должен возвращать преобразованные данные свойства ЭУ для использования в клиентском расширении ЭУ.
    3 Здесь метод SuperMethod требуемым образом преобразует текущее переданное значение ЭУ — bindingResult.Value.
    4 Метод Clone создаёт копию bindingResult, в поле Value которой записывается преобразованное значение из data.

    Конвертер вызывается автоматически при загрузке значения элемента управления, при условии совпадения названия конвертера в описателе и в расширении.

    Обратите внимание

    При разработке конвертера следует помнить следующую особенность: в конвертер всегда поступают данные текущей карточки. Если элемент управления связан с данными связанной карточки (не текущей), то получить её данные можно с помощью методов:

    • LayoutContextHelper.TryGetCardDataSource — сохраняет в cardId идентификатор карточки, с данными которой связан элемент управления.

    • LayoutContextHelper.TryGetDataSource — сохраняет идентификаторы метаданных карточки, с которыми связан элемент управления: в cardId — идентификатор карточки, в sectionId — идентификатор секции, в rowId — идентификатор строки.

    public override BindingResult ConvertForDisplay(ControlContext controlContext, Binding binding, BindingResult bindingResult)
    {
       CardKindModel model = null;
    if (LayoutContextHelper.TryGetCardDataSource(controlContext, binding, out var cardId))
       {
             model = ExSuperMethod(controlContext.LayoutContext.SessionContext, cardId);
       }
       return bindingResult.Clone(model);
    }
  3. Конвертер нужно добавить в IoC-контейнер в ядре серверного расширения:

    public override void InitializeContainer(ContainerBuilder containerBuilder) {
        containerBuilder.RegisterOrderedType<SuperConverter, IBindingConverter>();
    }

    Расширение должно быть опубликовано на сервере Web-клиента.