Преобразователи типов или расширения разметки для XAMLType Converters and Markup Extensions for XAML

Преобразователи типов и расширения разметки — это два метода, используемых системами типов XAML и средствами записи XAML для создания компонентов графа объектов.Type converters and markup extensions are two techniques that XAML type systems and XAML writers use to generate object graph components. Хотя они обладают общими характеристиками, преобразователи типов и расширения разметки представляются по-разному в потоке узлов XAML.Although they share some characteristics, type converters and markup extensions are represented differently in a XAML node stream. В этой документации преобразователи типов, расширения разметки и аналогичные конструкции иногда называются преобразователями значений.In this documentation set, type converters, markup extensions, and similar constructs are sometimes collectively referred to as value converters.

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

В XAML преобразователи значений используются для различных сценариев.In XAML, value converters are used for various scenarios. Ниже перечислены различные типы преобразователей значений в XAML.The following list shows the different types of value converters in XAML:

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

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

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

  • Связанный класс или вспомогательный класс, предоставляющий логику для текстового синтаксиса XAML.Related class or support class that provides the logic for a XAML text syntax

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

В определении служб XAML .NET преобразователи типов являются классами, производными от класса CLR TypeConverter .In .NET XAML Services definition, type converters are classes that derive from the CLR TypeConverter class. TypeConverter — Это класс, находился в .NET до существования XAML.TypeConverter is a class that was in the .NET before XAML existed. Его первоначальным намерением было поддержка окон свойств и аналогичных текстовых метафор редактирования для свойств интегрированной среды разработки.Its original purpose was to support property windows and similar text-based editing metaphors for IDE properties. Введение XAML в .NET использует TypeConverter для преобразования текстового синтаксиса (как обнаружено в значении атрибута или в узле значения XAML) в объект.The introduction of XAML to .NET uses TypeConverter to convert a text syntax (as found in an attribute value or a XAML value node) into an object. TypeConverter может также использоваться для сериализации значения объекта в текстовый синтаксис.TypeConverter can also be used to serialize an object value to text syntax. TypeConverter также использовался в предыдущих реализациях XAML для конкретной платформы в Windows Presentation Foundation (WPF) и Windows Communication Foundation (WCF).TypeConverter was also used in previous framework-specific XAML implementations in Windows Presentation Foundation (WPF) and Windows Communication Foundation (WCF). Дополнительные сведения о TypeConverter в XAML см. в разделе Type Converters for XAML Overview.For more information about the TypeConverter in XAML, see Type Converters for XAML Overview.

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

В реализации служб XAML .NET расширения разметки являются классами, производными от MarkupExtension класса.In .NET XAML Services implementation, markup extensions are classes that derive from the MarkupExtension class. Расширения разметки — это понятие, которое возникло в языке XAML.Markup extensions are a concept that in this form is originated by the XAML language. Расширение разметки можно представить чем-то вроде расширяемой Escape-последовательности, вызывающей класс службы для реализации своей логики.You can think of a markup extension as being something like an extensible escape sequence that calls into a service class to provide its logic. С точки зрения разметки обработчики XAML всегда распознают расширение разметки как текстовую последовательность, начинающуюся с открывающей фигурной скобки ({}) в текстовой строке.In terms of markup, XAML processors universally recognize a markup extension by a text sequence that starts with an opening brace ({) in a text string.

Расширения разметки отличаются от преобразователей типов.Markup extensions differ from type converters. Преобразователи типов обычно связаны с типами или членами.Type converters are typically associated with types or members. Они вызываются при создании графа объектов или при обнаружении текстового синтаксиса, связанного с этими сущностями, во время сериализации.They are invoked when an object graph creation or a serialization encounters text syntax that is associated with those entities.

Расширения разметки связаны с отдельным вспомогательным классом службы, но могут применяться к любому значению члена.Markup extensions are associated with a single supporting service class, but can be applied for any member value. (Однако вы можете реализовать расширение разметки, чтобы намеренно ограничить его использование определенными элементами или типами назначения с помощью контекста службы). Расширения разметки могут переопределять ассоциацию преобразователя типов.(However, you can implement your markup extension to deliberately restrict its use to certain members or destination types, by using service context.) Markup extensions can override a type converter association. Кроме того, их можно использовать, чтобы указать значение атрибута для членов, которые в противном случае не поддерживают текстовый синтаксис.Or you can use them to specify an attribute value for members that would not otherwise support a text syntax.

Дополнительные сведения о реализации шаблона расширения разметки для XAML см. в разделе Markup Extensions for XAML Overview.For more information about the markup extension implementation pattern for XAML, see Markup Extensions for XAML Overview.

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

ValueSerializer — это специализированные преобразователь типов, оптимизированный для преобразования объекта в строку.A ValueSerializer is a specialized type converter that is optimized for converting an object to a string. Объект ValueSerializer для XAML не может реализовывать метод ConvertFrom .A ValueSerializer for XAML might not implement the ConvertFrom method at all. Реализация ValueSerializer получает службы так, будто это реализация TypeConverter .A ValueSerializer implementation obtains services in a manner that is like a TypeConverter implementation. Виртуальные методы предоставляют входной параметр context .The virtual methods provide an input context parameter. Параметр context имеет тип IValueSerializerContext, который наследуется от интерфейса IServiceProvider и содержит метод GetService .The context parameter is of type IValueSerializerContext, which inherits from the IServiceProvider interface and has a GetService method.

В системе типов XAML и реализациях средств записи XAML, которые используют циклическую обработку узлов XAML для сериализации,преобразователь значений, связанный с типом или членом, доступен по собственному свойству XamlType.ValueSerializer .In the XAML type system and for XAML writer implementations that use XAML node loop processing for serialization, a value converter that is associated with a type or member is reported by its own XamlType.ValueSerializer property. Для средств записи XAML, выполняющих сериализацию, это значит, что если XamlType.TypeConverter и XamlType.ValueSerializer существуют, преобразователь типов можно использовать для пути загрузки, а сериализатор значений — для пути сохранения.The meaning to XAML writers that perform serialization is that if a XamlType.TypeConverter and XamlType.ValueSerializer exist, the type converter should be used for the load path and the value serializer should be used for the save path. Если XamlType.TypeConverter существует, но XamlType.ValueSerializernull, преобразователь типов также используется для пути сохранения.If XamlType.TypeConverter exists but XamlType.ValueSerializer is null, the type converter is also used for the save path.

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

Преобразователь значений можно расширить за границы конкретных шаблонов преобразователя типов или расширения разметки.A value converter is extensible beyond the specific patterns of a type converter or a markup extension. Однако для этой настройки также потребуется переопределение системы типов XAML, предоставляемой службами XAML .NET.However, this customization would also require the redefinition of the XAML type system as provided by .NET XAML Services. Существующая система типов XAML содержит представления и системы отчетности для преобразователей типов, расширений разметки и сериализаторов значений, но не для пользовательских форм преобразования значений.The existing XAML type system has representations and reporting systems for type converters, markup extensions, and value serializers, but not for custom forms of value conversion. Если вам требуется создать пользовательские преобразователи значений, используйте тип XamlValueConverter<TConverterBase> .If you want to create custom value converters, use the XamlValueConverter<TConverterBase> type.

Сочетание преобразователей типов и расширений разметкиType Converters and Markup Extensions in Combination

Расширения разметки и преобразователи типов используются в языке XAML в различных ситуациях.Markup extensions and type converters are used for different situations in XAML. Хотя для расширения разметки контекст доступен, поведение преобразования типов свойств, когда расширение разметки предоставляет значение, обычно не включается в реализацию расширения разметки.Although context is available for markup extension usages, type conversion behavior of properties where a markup extension provides a value is generally is not checked in the markup extension implementations. Другими словами, даже если расширение разметки возвращает текстовую строку в качестве выходных данных ProvideValue , преобразование типа для этой строки относительно конкретного свойства или типа значения свойства не применяется.In other words, even if a markup extension returns a text string as its ProvideValue output, type conversion behavior on that string as applied to a specific property or property value type is not invoked. Как правило, цель расширения разметки — обработать строку и вернуть объект без участия какого-либо преобразователя типов.Generally, the purpose of a markup extension is to process a string and return an object without any type converter involved.

Контекст службы для преобразователя значенийService Context for a Value Converter

При реализации преобразователя значений часто требуется доступ к контексту, в котором он применяется.When you implement a value converter, you often need access to a context in which the value converter is applied. Этот контекст называют контекстом службы.This context is known as the service context. Контекст службы может включать такие сведения, как активный контекст схемы XAML, доступ к системе сопоставления типов, предоставляемой контекстом схемы XAML и средством записи объектов XAML, и т. д.The service context might include information such as the active XAML schema context, access to the type-mapping system that the XAML schema context and XAML object writer provide, and so on. Дополнительные сведения о контекстах служб, доступных для преобразователя значений, и способах доступа к службам, которые могут предоставить контекст службы, см. в разделе Service Contexts Available to Type Converters and Markup Extensions.For more information about the service contexts available for a value converter and how to access the services that a service context might provide, see Service Contexts Available to Type Converters and Markup Extensions.

См. такжеSee also