XAML 的类型转换器和标记扩展

类型转换器和标记扩展是 XAML 类型系统和 XAML 编写器用于生成对象图组件的两种技术。 尽管它们共享某些特征,但类型转换器和标记扩展在 XAML 节点流中以不同的方式表示。 在此文档集中,类型转换器、标记扩展和类似的构造有时统称为值转换器。

值转换器

在 XAML 中,值转换器用于各种方案。 以下列表显示了 XAML 中的不同类型的值转换器:

  • 类型转换器

  • 标记扩展

  • 值序列化程序

  • 提供 XAML 文本语法逻辑的相关类或支持类

类型转换器

在 .NET XAML 服务定义中,类型转换器是从 CLR TypeConverter 类派生的类。 TypeConverter 是 XAML 存在之前在 .NET 中的类。 其原始目的是支持属性窗口和类似基于文本的 IDE 属性的编辑隐喻。 将 XAML 引入 .NET 使用 TypeConverter 将文本语法(如属性值或 XAML 值节点中发现)转换为对象。 TypeConverter 还可用于将对象值序列化为文本语法。 TypeConverter 还用于 Windows Presentation Foundation(WPF)和 Windows Communication Foundation(WCF)中以前特定于框架的 XAML 实现。 有关 XAML 中的 TypeConverter 的详细信息,请参阅适用于 XAML 的 类型转换器

标记扩展

在 .NET XAML Services 实现中,标记扩展是从 MarkupExtension 类派生的类。 标记扩展是一个概念,在此表单中由 XAML 语言发起。 可以将标记扩展视为一种类似于调用服务类以提供其逻辑的可扩展转义序列。 在标记方面,XAML 处理器通过文本序列普遍识别标记扩展,该序列以文本字符串中的左大括号 ({) 开头。

标记扩展不同于类型转换器。 类型转换器通常与类型或成员相关联。 当对象图创建或序列化遇到与这些实体关联的文本语法时,将调用它们。

标记扩展与单个支持服务类相关联,但可以应用于任何成员值。 (但是,可以使用服务上下文实现标记扩展,以故意将其使用限制为某些成员或目标类型。标记扩展可以替代类型转换器关联。 或者,可以使用它们为不支持文本语法的成员指定属性值。

有关 XAML 的标记扩展实现模式的详细信息,请参阅 XAML 标记扩展概述

值序列化程序

ValueSerializer 是一个专用类型转换器,经过优化,可将对象转换为字符串。 XAML 的 ValueSerializer 根本无法实现 ConvertFrom 方法。 ValueSerializer 实现以类似于 TypeConverter 实现的方式获取服务。 虚拟方法提供输入 context 参数。 context 参数的类型为 IValueSerializerContext,它继承自 IServiceProvider 接口,并具有 GetService 方法。

在 XAML 类型系统和使用 XAML 节点循环处理进行序列化的 XAML 编写器实现中,由其自己的 XamlType.ValueSerializer 属性报告与类型或成员关联的值转换器。 执行序列化的 XAML 编写器的意义在于,如果存在 XamlType.TypeConverterXamlType.ValueSerializer,则类型转换器应用于加载路径,值序列化程序应用于保存路径。 如果存在 XamlType.TypeConverterXamlType.ValueSerializernull,则类型转换器也用于保存路径。

其他值转换器

值转换器在类型转换器或标记扩展的特定模式之外是可扩展的。 但是,此自定义还需要重新定义 .NET XAML 服务提供的 XAML 类型系统。 现有的 XAML 类型系统具有类型转换器、标记扩展和值序列化程序的表示形式和报告系统,但不适用于自定义形式的值转换。 如果要创建自定义值转换器,请使用 XamlValueConverter<TConverterBase> 类型。

组合类型转换器和标记扩展

标记扩展和类型转换器用于 XAML 中的不同情况。 尽管上下文可用于标记扩展用法,但标记扩展提供值的属性的类型转换行为通常不会在标记扩展实现中检查。 换句话说,即使标记扩展将文本字符串作为其 ProvideValue 输出返回,也不会调用应用于特定属性或属性值类型的该字符串的类型转换行为。 通常,标记扩展的目的是处理字符串并返回对象,而无需涉及任何类型转换器。

值转换器的服务上下文

实现值转换器时,通常需要访问应用值转换器的上下文。 此上下文称为服务上下文。 服务上下文可能包括活动 XAML 架构上下文、访问 XAML 架构上下文和 XAML 对象编写器提供的类型映射系统等信息。 有关可用于值转换器的服务上下文以及如何访问服务上下文可能提供的服务的详细信息,请参阅 可用于类型转换器的服务上下文和标记扩展

另请参阅