XAML 中的泛型
System.Xaml 中实现的 .NET XAML 服务支持使用泛型 CLR 类型。 此支持包括将泛型的约束指定为类型参数,并通过为泛型集合事例调用适当的 Add
方法强制实施约束。 本主题介绍在 XAML 中使用和引用泛型类型的方面。
x:TypeArguments
x:TypeArguments
是由 XAML 语言定义的指令。 当它用作由泛型类型支持的 XAML 类型的成员时,x:TypeArguments
将泛型的约束类型参数传递给后备构造函数。 有关与 .NET XAML 服务使用 x:TypeArguments
相关的参考语法(包括语法示例),请参阅 x:TypeArguments 指令。
由于 x:TypeArguments
采用字符串,并且具有类型转换器支持,因此它通常在 XAML 用法中声明为属性。
在 XAML 节点流中,x:TypeArguments
声明的信息可以从节点流中 StartObject
位置的 XamlType.TypeArguments 获取。
XamlType.TypeArguments 的返回值是 XamlType 值的列表。 通过调用 XamlType.IsGeneric确定 XAML 类型是否表示泛型类型。
XAML 中泛型的规则和语法约定
在 XAML 中,泛型类型必须始终表示为受限泛型。 不受约束的泛型永远不会存在于 XAML 类型系统或 XAML 节点流中,不能在 XAML 标记中表示。 对于 x:TypeArguments
引用泛型的嵌套类型约束,或者对于 x:Type
为泛型类型提供 CLR 类型引用的情况,可以在 XAML 属性语法中引用泛型。 通过 .NET XAML 服务定义的 XamlTypeTypeConverter 类支持引用泛型。
XamlTypeTypeConverter 启用的 XAML 属性语法形式会更改典型的 MSIL/CLR 语法约定,该约定使用尖括号作为泛型的类型和约束,而是替换约束容器的括号。 有关示例,请参阅 x:TypeArguments 指令。
泛型和 XAML 2009 功能
如果使用 XAML 2009 而不是映射 CLR 基类型来获取公共语言基元的 XAML 类型,则可以 XAML 2009 内置类型 作为 x:TypeArguments
中的信息项。 例如,可以声明以下内容(前缀映射未显示,但 x
是 XAML 2009 的 XAML 语言 XAML 命名空间):
<my:BusinessObject x:TypeArguments="x:String,x:Int32"/>
WPF 中的泛型支持
对于特别面向 WPF 时的 XAML 2006 用法,还必须在与 x:TypeArguments
相同的元素上提供 x:Class,并且该元素必须是 XAML 文档中的根元素。 根元素必须映射到具有至少一个类型参数的泛型类型。 例如 PageFunction<T>。
支持泛型用法的可能解决方法包括定义可返回泛型类型的自定义标记扩展,或提供派生自泛型类型的包装类定义,但平展其自己的类定义中的泛型约束。
在 WPF 中,可以将 XAML 2009 功能与 x:TypeArguments
结合使用,但仅适用于松散 XAML(未编译标记的 XAML)。 WPF 的标记编译 XAML 和 XAML 的 BAML 形式目前不支持 XAML 2009 关键字和功能。
Windows Workflow Foundation for .NET Framework 3.5 中的自定义工作流不支持通用 XAML 用法。