Преобразователи типов или расширения разметки для XAML

Преобразователи типов и расширения разметки — это два метода, используемых системами типов XAML и средствами записи XAML для создания компонентов графа объектов. Хотя они обладают общими характеристиками, преобразователи типов и расширения разметки представляются по-разному в потоке узлов XAML. В этой документации преобразователи типов, расширения разметки и аналогичные конструкции иногда называются преобразователями значений.

Преобразователи значений

В XAML преобразователи значений используются для различных сценариев. Ниже перечислены различные типы преобразователей значений в XAML.

  • Преобразователь типов

  • Расширение разметки

  • Сериализатор значений

  • Связанный класс или вспомогательный класс, предоставляющий логику для текстового синтаксиса XAML.

Преобразователи типов

В определении служб XAML .NET преобразователи типов — это классы, производные от класса CLR TypeConverter . TypeConverter — это класс, который был в .NET до существования XAML. Его первоначальной целью было поддерживать окна свойств и аналогичные текстовые метафоры редактирования для свойств интегрированной среды разработки. Введение XAML в .NET используется TypeConverter для преобразования текстового синтаксиса (как указано в значении атрибута или узле значения XAML) в объект. TypeConverter может также использоваться для сериализации значения объекта в текстовый синтаксис. TypeConverter также использовался в предыдущих реализациях XAML для конкретной платформы в Windows Presentation Foundation (WPF) и Windows Communication Foundation (WCF). Дополнительные сведения о TypeConverter в XAML см. в разделе Type Converters for XAML Overview.

Расширения разметки

В реализации служб XAML .NET расширения разметки — это классы, производные MarkupExtension от класса. Расширения разметки — это понятие, которое возникло в языке XAML. Расширение разметки можно представить чем-то вроде расширяемой Escape-последовательности, вызывающей класс службы для реализации своей логики. С точки зрения разметки обработчики XAML всегда распознают расширение разметки как текстовую последовательность, начинающуюся с открывающей фигурной скобки ({}) в текстовой строке.

Расширения разметки отличаются от преобразователей типов. Преобразователи типов обычно связаны с типами или членами. Они вызываются при создании графа объектов или при обнаружении текстового синтаксиса, связанного с этими сущностями, во время сериализации.

Расширения разметки связаны с отдельным вспомогательным классом службы, но могут применяться к любому значению члена. (Однако расширение разметки можно реализовать, чтобы намеренно ограничить его использование определенными элементами или целевыми типами с помощью контекста службы.) Расширения разметки могут переопределить связь преобразователя типов. Кроме того, их можно использовать, чтобы указать значение атрибута для членов, которые в противном случае не поддерживают текстовый синтаксис.

Дополнительные сведения о реализации шаблона расширения разметки для XAML см. в разделе Markup Extensions for XAML Overview.

Сериализаторы значений

ValueSerializer — это специализированные преобразователь типов, оптимизированный для преобразования объекта в строку. Объект ValueSerializer для XAML не может реализовывать метод ConvertFrom . Реализация ValueSerializer получает службы так, будто это реализация TypeConverter . Виртуальные методы предоставляют входной параметр context . Параметр context имеет тип IValueSerializerContext, который наследуется от интерфейса IServiceProvider и содержит метод GetService .

В системе типов XAML и реализациях средств записи XAML, которые используют циклическую обработку узлов XAML для сериализации,преобразователь значений, связанный с типом или членом, доступен по собственному свойству XamlType.ValueSerializer . Для средств записи XAML, выполняющих сериализацию, это значит, что если XamlType.TypeConverter и XamlType.ValueSerializer существуют, преобразователь типов можно использовать для пути загрузки, а сериализатор значений — для пути сохранения. Если XamlType.TypeConverter существует, но XamlType.ValueSerializernull, преобразователь типов также используется для пути сохранения.

Другие преобразователи значений

Преобразователь значений можно расширить за границы конкретных шаблонов преобразователя типов или расширения разметки. Однако для этой настройки также потребуется переопределение системы типов XAML, предоставляемой службами XAML. Существующая система типов XAML содержит представления и системы отчетности для преобразователей типов, расширений разметки и сериализаторов значений, но не для пользовательских форм преобразования значений. Если вам требуется создать пользовательские преобразователи значений, используйте тип XamlValueConverter<TConverterBase> .

Сочетание преобразователей типов и расширений разметки

Расширения разметки и преобразователи типов используются в языке XAML в различных ситуациях. Хотя для расширения разметки контекст доступен, поведение преобразования типов свойств, когда расширение разметки предоставляет значение, обычно не включается в реализацию расширения разметки. Другими словами, даже если расширение разметки возвращает текстовую строку в качестве выходных данных ProvideValue , преобразование типа для этой строки относительно конкретного свойства или типа значения свойства не применяется. Как правило, цель расширения разметки — обработать строку и вернуть объект без участия какого-либо преобразователя типов.

Контекст службы для преобразователя значений

При реализации преобразователя значений часто требуется доступ к контексту, в котором он применяется. Этот контекст называют контекстом службы. Контекст службы может включать такие сведения, как активный контекст схемы XAML, доступ к системе сопоставления типов, которую предоставляет контекст схемы XAML и модуль записи объектов XAML, и т. д. Дополнительные сведения о контекстах служб, доступных для преобразователя значений, и способах доступа к службам, которые могут предоставить контекст службы, см. в разделе Service Contexts Available to Type Converters and Markup Extensions.

См. также