XAML 的类型转换器和标记扩展
类型转换器和标记扩展是 XAML 类型系统和 XAML 编写器用来生成对象图组件的两种技术。 尽管类型转换器和标记扩展共享一些特征,但它们在 XAML 节点流中以不同的方式表示。 在本文档集中,类型转换器、标记扩展和类似的构造有时统称为值转换器。
值转换器
在 XAML 中,值转换器能用于各种方案。 以下列表显示了 XAML 中不同类型的值转换器:
类型转换器
标记扩展
值序列化程序
为 XAML 文本语法提供逻辑的相关类或支持类
类型转换器
在 .NET XAML 服务定义中,类型转换器是从 CLR TypeConverter 类派生的类。 TypeConverter 是在 XAML 存在之前就存在于 .NET 中的类。 它的原始用途是向 IDE 属性提供对属性窗口和类似的基于文本的编辑隐喻的支持。 对 .NET 引入 XAML 则使用 TypeConverter 将文本语法(在属性值或 XAML 值节点中找到)转换为对象。 TypeConverter 还可用于将对象值序列化为文本语法。 TypeConverter 还用于之前在 Windows Presentation Foundation (WPF) 和 Windows Communication Foundation (WCF) 中特定于框架的 XAML 实现。 有关 XAML 中 TypeConverter 的更多信息,请参见 Type Converters for XAML Overview中特定于框架的 XAML 实现。
标记扩展
在 .NET XAML 服务实现中,标记扩展是从 MarkupExtension 类派生的类。 标记扩展是此窗体中一个源于 XAML 语言的概念。 你可以将标记扩展视为类似于可扩展转义序列的东西,它会调入服务类以提供其逻辑。 就标记而言,XAML 处理器普遍通过以文本字符串中一个左大括号 ({) 开头的文本序列来识别标记扩展。
标记扩展不同于类型转换器。 类型转换器通常与类型或成员相关联。 当创建对象图或进行序列化期间遇到与那些实体相关联的文本语法时会调用它们。
标记扩展与单一支持服务类相关联,但可以应用于任意成员值。 (但是,可通过使用服务上下文来实现标记扩展,以有意将其应用限制为仅对某些成员或目标类型进行应用。)标记扩展可以替代类型转换器关联。 或者,可将其用于为本来不支持文本语法的成员指定特性值。
有关 XAML 的标记扩展实现模式的详细信息,请参阅 Markup Extensions for XAML Overview。
值序列化程序
ValueSerializer 是针对将对象转换为字符串进行了优化的专用的类型转换器。 XAML 的 ValueSerializer 可能完全不会实现 ConvertFrom
方法。 ValueSerializer 实现以类似于 TypeConverter 实现的方式获取服务。 虚方法提供了一个输入 context
参数。 context
参数的类型为 IValueSerializerContext,它继承自 IServiceProvider 接口,并具有 GetService 方法。
在 XAML 类型系统中,对于使用 XAML 节点循环处理进行序列化的 XAML 编写器实现,由其自身的 XamlType.ValueSerializer 属性报告与某一类型或成员相关联的值转换器。 执行序列化的 XAML 编写器的含义是,如果存在 XamlType.TypeConverter 和 XamlType.ValueSerializer ,则类型转换器应用于加载路径,值序列化应用于保存路径。 如果 XamlType.TypeConverter 存在但 XamlType.ValueSerializer 为 null
,则类型转换器也用于保存路径。
其他值转换器
值转换器具有超越类型转换器或标记扩展的特定模式的可扩展性。 但是,此自定义也需要由 .NET XAML 服务提供的 XAML 类型系统的重新定义。 现有的 XAML 类型系统具有针对类型转换器、标记扩展和值序列化程序(而无针对值转换的自定义窗体的)的表示形式和报告系统。 如果你想要创建自定义值转换器,请使用 XamlValueConverter<TConverterBase> 类型。
组合使用类型转换器和标记扩展
标记扩展和类型转换器在 XAML 中用于不同情况。 尽管上下文可用于标记扩展用途,但通常不会在标记扩展实现中检查属性的类型转换行为(其中标记扩展提供了一个值)。 换言之,即使标记扩展返回一个文本字符串作为其 ProvideValue
输出,该字符串上应用于特定属性或属性值类型的类型转换行为也不会被调用。 通常,标记扩展的目的是处理字符串并返回不涉及任意类型转换器的对象。
值转换器的服务上下文
当实现值转换器时,你经常需要访问在其中应用了值转换器的上下文。 此上下文称为服务上下文。 服务上下文可能包括如下信息:活动的 XAML 架构上下文、对 XAML 架构上下文和 XAML 对象写入器提供的类型映射系统的访问权限等等。 有关可用于值转换器的服务上下文和如何访问服务上下文可能会提供的服务的详细信息,请参阅 Service Contexts Available to Type Converters and Markup Extensions。