Универсальные шаблоны в XAML
Службы XAML платформы .NET Framework, реализованные в System.Xaml, обеспечивают поддержку использования универсальных типов среды CLR. В эту поддержку входят указание ограничений универсальных типов в качестве аргумента типа и обеспечение соблюдения ограничений путем вызова соответствующего метода Add для универсальных коллекций. В этом разделе описываются различные аспекты использования универсальных типов в XAML и создания ссылок на них.
Атрибут x:TypeArguments
x:TypeArguments является директивой, определенной языком XAML. При использовании в качестве члена типа XAML, зарезервированного универсальным типом, x:TypeArguments передает ограничительные аргументы универсального типа резервному конструктору. Сведения о синтаксисе, относящемся к использованию службами XAML платформы .NET Framework атрибута x:TypeArguments, включая примеры синтаксиса, см. в разделе Директива x:TypeArguments.
Поскольку атрибут x:TypeArguments принимает строку и обладает резервированием преобразователя типов, обычно он объявляется в употреблении XAML в качестве атрибута.
В потоке узлов XAML сведения, объявленные атрибутом x:TypeArguments, могут быть получены из свойства XamlType.TypeArguments на позиции StartObject в потоке узлов. Возвращаемое значение свойства XamlType.TypeArguments представляет собой перечень значений XamlType. Определить, представляет ли тип XAML универсальный тип, можно путем вызова XamlType.IsGeneric.
Соглашения и правила и синтаксиса для универсальных типов в XAML
В XAML универсальный тип всегда должен быть представлен как универсальный тип с ограничениями; универсальный тип без ограничений никогда не представлен в системе типов XAML или потоке узлов XAML и не может быть представлен в разметке XAML. На универсальный тип может быть сделана ссылка в пределах синтаксиса атрибутов XAML в тех случаях, где на ограничение вложенного типа универсального типа ссылается директива x:TypeArguments, а также в случаях, где расширение разметки x:Type предоставляет ссылку на тип CLR для универсального типа. Это поддерживается при помощи класса XamlTypeTypeConverter, определенного службами XAML платформы .NET Framework.
Форма синтаксиса атрибутов XAML, включенная классом XamlTypeTypeConverter, изменяет типовое соглашение синтаксиса MSIL / CLR, которое использует угловые скобки для типов и ограничений универсальных типов, а вместо этого заменяет круглые скобки контейнером ограничения. Пример см. в разделе Директива x:TypeArguments.
Универсальные типы и возможности XAML 2009
При использовании XAML 2009 вместо сопоставления базовых типов CLR для получения типов XAML для общих языковых примитивов можно использовать Встроенные типы XAML 2009 в качестве информационных элементов в x:TypeArguments. Например, можно объявить следующее (сопоставления префиксов не показаны, но x является пространством имен XAML языка XAML для XAML 2009):
<my:BusinessObject x:TypeArguments="x:String,x:Int32"/>
Поддержка универсальных типов в WPF и других платформах версии 3.5
Для использования XAML 2006 при нацеливании конкретно на WPF необходимо также предоставлять директиву x:Class на том же элементе, что и директиву x:TypeArguments, причем этот элемент должен быть корневым элементом в документе XAML. Корневой элемент должен сопоставляться с универсальным типом хотя бы одним аргументом типа. Например, PageFunction<T>.
К возможным способам поддержки использований универсальных типов относятся определение пользовательского расширения разметки, которое может возвращать универсальные типы, а также предоставление определения класса оболочки, которое является производным от универсального типа, но смягчает универсальное ограничение в своем собственном определении класса.
В WPF и при нацеливании на .NET Framework 4 можно использовать возможности XAML 2009 вместе с директивой x:TypeArguments, но только для свободного XAML (кода XAML, не являющегося компилированной разметкой). XAML с компилированной разметкой для WPF и форма BAML кода XAML в настоящее время не поддерживают ключевые слова и возможности XAML 2009.
Пользовательские рабочие процессы в Windows Workflow Foundation для .NET Framework 3.5 не поддерживают универсальное использование XAML.