Overview При обработке данных часто возникает необходимость преобразования значения определенного типа в его строковое представление. Ряд связанных с этой проблемой задач могут быть решены при использовании класса XafariObjectFormatter. Наряду с возможностями класса ObjectFormatter платформы .NET, XafariObjectFormatter предоставляет также ряд дополнительных функций, востребованных разработчиком XAFприложений. Форматированный вывод Добавлена возможность указывать дополнительный формат в нотации стандартных форматеров .NET (описание форматов см. в MSDN). Для расчета форматированного значения используется специальный сервис Formatter, который понимает выбранную нотацию описания формата. Для своей работы Formatter требует указания объекта (контекста), который используется как параметр алгоритма. Например, если нам необходимо рассчитать значение параметра объекта и при этом использовать Дату создания документа, то в качестве контекста должен использоваться объект Реквизит, и формат будет иметь вид: {0:Документ.ДатаСоздания, yyyy}. Навигация по элементам коллекци Добавлена возможность навигации по элементам коллекций, которые реализуют интерфейсы ICalculatedParameter, IDictionary, IList, IEnumerable (указано в порядке уменьшения приоритета) Навигация по свойствам параметров XAF Добавлена возможность навигации по свойствам параметров (или константы). Список констант может быть расширен по мере необходимости. XafariObjectFormatter может быть применен для гибкой настройки модели приложения, например, при настройке нумераторов. Start here Необходимо преобразовать значение типа DateTime в строки следующих форматов: a) число месяц (1 мая) b) для дат недельной давности выводить: неделю назад Для решения такой задачи с использованием XafariObjectFormatter необходимо выполнить следующие действия: 1. Добавить модуль Xafari.BCModule в Module Project 2. При работе с данными задать формат: XafariObjectFormatter.Format({0: dateObject, “dd MMMM”}, this); XafariObjectFormatter.Format({0: @WeekAgo, ”dd.MM.yy”}, this); 3. Запустить приложение и оценить результат Learn more Design-time features Форматированный вывод Дополнительный формат указывается в нотации стандартных форматеров .NET. Используется следующая нотация: {0:<формат_навигация_по_свойствам>,<форматирование>} Для расчета форматированного значения используется специальный сервис Formatter, который понимает выбранную нотацию описания формата. Для своей работы Formatter требует указания объекта (контекста), который используется как параметр алгоритма. Например, если нам необходимо рассчитать значение параметра объекта и при этом использовать Дату создания документа, то в качестве контекста должен использоваться объект Реквизит, и формат будет иметь вид: ={0:Документ.ДатаСоздания, yyyy} Символ ‘=’ в начале строки означает, что данный текст представляет собой формат для formatter. Все, что следует сразу за символом ‘=’, подлежит форматированию. Фигурные скобки ограничивают ту часть текста, куда должно попасть форматированное значение. (Чтобы отобразить в конечном результате символы ‘{’ и ‘}’, необходимо использовать ‘{{’ и ‘}}’ соответственно). Formatter разбивает всю исходную строку на части, выделяет все те, которые подлежат форматированию, и последовательно запускает алгоритм форматирования для каждой части. 0: - это обязательная часть, которая сообщает форматеру, что для данного формата в качестве контекста будет использоваться 0-ой параметр. (В данном форматере можно передать только один объект (контест) в качестве параметра. Поэтому всегда используется 0.) В нашем примере в качестве контекста выступает объект Реквизит. После двоеточия следует сам формат, который может состоять из двух частей: 1. Обязательная часть. Указывает путь навигации по свойствам объектов, чтобы добраться до нужного объекта и отформатировать его значение. Форматер умеет проводить навигацию по свойствам объекта стандартных типов, ссылочных, а также по элементам коллекций (см. Навигация по элементам коллекции). Есть ряд свойств (может изменяться), которые называются параметрами, носят глобальный характер и которые также могут использоваться при навигации (см. Навигация по свойствам параметров) В нашем примере это означает, что начиная от объекта Реквизит (начальный контекст) сначала берем его свойство Документ, затем у объекта Документ берем свойство ДатаСоздания. Полученный в самом конце объект и будет форматироваться. 2. Необязательная часть. Форматирование конечного объекта. Если эта часть не указана, то будет использоваться формат по умолчанию, определенный для каждого типа данных. В нашем примере указан формат ‘yyyy’. Это означает, что конечный объект имеет тип Дата и для него применяется этот формат, который выведет Год и для этого использует 4 символа. Полное описание поддерживаемых форматов для стандартных типов данных можно изучить по следующим источникам: 1. Общие сведения о форматировании 2. Строки числовых форматов a. Строки настраиваемых числовых форматов 3. Строки форматов даты и времени a. Строки настраиваемых форматов даты и времени 4. Строки форматов перечислений Навигация по элементам коллекции Коллекция должна реализовывать один из следующих интерфейсов: ICalculatedParameter, IDictionary, IList, IEnumerable. Для навигации по элементам коллекций применяется следующая нотация: {0:<свойство_или_элемент_коллекции>(.<свойство_или_элемент_коллекции>),<формати рование>} <свойство_или_элемент_коллекции> :- <свойство> | [<индекс>] | [Значение] <индекс> :- <порядковый номер> | <текст> Для ICalculatedParameter обрабатывается [Значение]. При этом берется не значение поля Значение, а вызывается расчет значения параметра при помощи ObjectFormatter. Формат берется из поля Значение, а контекстом форматирования является тот же объект. Если объект реализует IDictionary, то выбирается объект с ключом <индекс>. <индекс> считается строкой. Если объект реализует IList. Сначала форматтер пытается преобразовать IList в список именованных объектов (с интерфейсом INameSupport) и вернуть объект с именем <индекс>. Если не удается, <индекс> считается числом, и возвращается элемент с указанным порядковым номером. Если объект реализует IEnumerable. <индекс> считается числом, и возвращается элемент с указанным порядковым номером. Навигация по свойствам параметров XAF Нотация: {0:@<имя_параметра>.<свойство_или_элемент_коллекции>(.<свойство_или_элемент_ коллекции>),<форматирование>} Список констант может быть расширен по мере необходимости. По умолчанию он содержит: CurrentDate // текущая дата CurrentDateTime // текущая дата и время CurrentDatePlus1Day // текущая дата плюс 1 день CurrentDatePlus2Days // текущая дата плюс 2 дня CurrentDatePlus3Days // текущая дата плюс 3 дня WeekAgo // прошлая неделя CurrenUserID // текущий пользователь Examples Пример 1 Дан объект типа Double, для которого в качестве данных необходимо выводить строку формата, где после точки остается 2 знака: XafariObjectFormatter.Format({0: doubleObject, “#.##”}, this); Пример 2 Дан объект IDictionary, для которого в качестве данных необходимо выводить строку заданного индекса и определенного формата: XafariObjectFormatter.Format({0: dictionaryObject, исходя из объекта}, this); Пример 3 Код, обрабатывающий DateTime: #region DateTime // строка для задания формата private string dateFormat; public string DateFormat { get { return dateFormat; } set { SetPropertyValue("DateFormat", ref dateFormat, value); } } // задаваемая дата private DateTime dateData; public DateTime DateData { get { return dateData; } set { SetPropertyValue("DateData", ref dateData, value); } } // результирующая функция, которая возвращает отформатированные данные public string DataFormatter { get { if (String.IsNullOrEmpty(DateFormat)) return ForResultFormatter("{0:DateData}"); else return ForResultFormatter(String.Format("{{0:DateData, {0}}}", DateFormat)); } } #endregion #region Method //функция форматирования public string ForResultFormatter(string formatString) { string formatData = String.Empty; try { XafariObjectFormatter.Initialize(); formatData = XafariObjectFormatter.Format(formatString, this); return formatData; } catch{return null;} } #endregion