Конвертация значения элемента управления
Программист может внедрить в механизм получения значения элемента управления функцию конвертации, которая требуемым образом подготовит данные для использования в клиентском компоненте элемента управления.
-
Указать в описателе свойства
Binding
название функции конвертации:-
в текстовом описателе — в атрибуте
BindingConverter
:<Property Type="Binding" BindingConverter="SuperConverter" />
-
в бинарном описателе — в методе
GetBindingLoader
:var bindingProperty = PropertyFactory.GetBindingProperty(); bindingProperty.GetBindingLoader = (() => new SimpleBindingLoader { ConverterType = "SuperConverter" });
-
-
Добавить класс конвертер в серверное расширение.
Класс конвертера является производным от
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
.Конвертер вызывается автоматически при загрузке значения элемента управления, при условии совпадения названия конвертера в описателе и в расширении.
-
Конвертер нужно добавить в IoC-контейнер в ядре серверного расширения:
public override void InitializeContainer(ContainerBuilder containerBuilder) { containerBuilder.RegisterOrderedType<SuperConverter, IBindingConverter>(); }
Расширение должно быть опубликовано на сервере Web-клиента.