Поделиться через


TypeConverters и XAML

Обновлен: Ноябрь 2007

Класс TypeConverter служит конкретной цели как часть реализации управления пользовательским классом, который может использоваться в качестве значения в использовании атрибута Язык XAML (Extensible Application Markup Language). При написании пользовательского класса и при необходимости того, чтобы экземпляры класса могли использоваться как значения настраиваемого атрибута Язык XAML (Extensible Application Markup Language), может понадобится применение TypeConverterAttribute к классу, написание пользовательского класса TypeConverter или оба действия.

В этом разделе содержатся следующие подразделы.

  • XAML и строковые параметры
  • Реализация преобразователя типов
  • Применение TypeConverterAttribute
  • Связанные разделы

XAML и строковые параметры

При установке значения атрибута в XAML начальным типом этого значения будет String. Даже другие примитивы, например Double, изначально являются строками для обработчика XAML, несмотря на то, что преобразование в другие нестроковые значения примитивов или из именных значений перечисления является относительно простым из-за преобразований встроенных типов.

Обработчику XAML требуется два сообщения для того, чтобы обработать значение атрибута. Первое сообщение является типом значения устанавливаемого свойства. Любая строка, которая определяет значение атрибута и обрабатывается в XAML, в конечном счете должна быть разложена или преобразована к значению этого типа. Если значение равно примитиву, то выполняется прямое преобразование строки. Если значение является перечислением, то строка используется для проверки совпадения имени в этом перечислении. Если значение не является ни примитивом ни перечислением, то тип в вопросе должен обладать возможность предоставления экземпляра типа или значения, основанного на преобразованной строке.

Особым случаем является расширение разметки. Использования расширения разметки должны обрабатываться процессором XAML перед проверкой типа свойства и других соображений. Как правило, цель расширения разметки состоит в том, чтобы обработать строку и вернуть объект. Если объект, возвращенный как тип, соответствует свойству, расширение разметки предоставляет значение для свойства таким способом, который позволяет избежать преобразования любого типа, происходящего вне кода реализации расширения разметки. Одна общая ситуация, где расширение разметки необходимо, заключается в создании ссылки на объект, который уже существует (в лучшем случае, преобразователь типа с неопределенным состоянием может только создать новый экземпляр, который может оказаться нежелательным). Дополнительные сведения о расширениях разметки содержатся в разделе Расширения разметки и XAML.

TypeConverter

Если значение не является простым типом или перечислением и при этом не используется расширение разметки, то должны быть какие-либо средства преобразования String в соответствующее значение или новый экземпляр при обработке XAML. Это роль реализации TypeConverter. TypeConverter определяет четыре члена, которые релевантны для преобразования в и из строк для обработки целей XAML:

Из них наиболее важен метод ConvertFrom. Этот метод преобразует входную строку к требуемому типу объекта.

Вторым по важности методом является ConvertTo. Если приложение WPF преобразуется в представление разметки (например, если оно сохраняется в XAML), ConvertTo отвечает за создание представления разметки.

CanConvertTo и CanConvertFrom поддерживают методы, которые используются тогда, когда службы запрашивают характеристики реализации TypeConverter. В некоторых случаях необходимо реализовать эти методы для возврата true, особенно для типа String.

Реализация преобразователя типов

Реализация ConvertFrom

Для наличия возможности использования в качестве реализации TypeConverter, поддерживающей XAML, метод ConvertFrom для этого преобразователя должен принимать строку как параметр value. Если строка была в допустимом формате и может быть преобразована с помощью реализации TypeConverter, то возвращаемый объект должен поддерживать возможность приведения к типу, ожидаемому свойством. В противном случае реализация ConvertFrom должна возвращать null.

Каждая реализация TypeConverter может иметь собственную интерпретацию того, что составляет допустимую строку для преобразования, а также может использовать или игнорировать описание типа или контекстов языка и региональных параметров, переданных в качестве параметров. Тем не менее обработка WPF XAML может не передать значения в контекст описания типа во всех случаях, а также может не передать язык и региональные параметры на основе xml-lang.

Aa970913.alert_note(ru-ru,VS.90).gifПримечание.

Не используйте фигурные скобки, особенно {, как возможный элемент формата строки. Эти знаки зарезервированы как вход и выход для последовательности расширения разметки.

Реализация ConvertTo

ConvertTo можно потенциально использовать для поддержки сериализации. Поддержка сериализации для пользовательского типа не является обязательным требованием. Однако, при реализации элемента управления или используя сериализацию, как часть функций, или разрабатывая класс, следует реализовать ConvertTo.

Для наличия возможности использования в качестве реализации TypeConverter XAML, поддерживающей ConvertTo, метод value для этого преобразователя должен принимать экземпляр поддерживаемого типа (или значения) в качестве параметра. Когда параметр destinationType является типом String, то возвращаемый объект должен изменять форму на String. Возвращаемая строка должна отображать сериализованное значение value. В идеальном случае выбранный формат сериализации должен поддерживать создание того же значения, в случае передачи этой строки реализации ConvertFrom того же преобразователя, без значительной потери информации.

Если значение не может быть сериализовано, или преобразователь не поддерживает сериализацию, реализация ConvertTo должна возвращать null и разрешается выбросить исключение в данном случае.

Если параметр destinationType не из типов String, то можно выбрать собственную обработку преобразователя. Как правило это возвращает к базовой обработке реализации.

Каждая реализация TypeConverter может иметь собственную интерпретацию того, что составляет допустимую строку для преобразования, а также может использовать или игнорировать описание типа или контекстов языка и региональных параметров, переданных в качестве параметров.

Aa970913.alert_note(ru-ru,VS.90).gifПримечание.

Не используйте фигурные скобки, особенно {, как возможный элемент формата строки. Эти знаки зарезервированы как вход и выход для последовательности расширения разметки.

Реализация CanConvertTo

Реализация CanConvertTo должна возвращать true для destinationType типа String, а в противном случае откладывать до базовой реализации.

Реализация CanConvertFrom

Реализация CanConvertFrom должна возвращать true для sourceType типа String, а в противном случае откладывать до базовой реализации.

Применение TypeConverterAttribute

Для того, чтобы использовать пользовательский тип преобразователя в качестве действующего типа преобразователя для пользовательского класса, необходимо применить Атрибут NET Framework TypeConverterAttribute к определению класса. ConverterTypeName, указываемое посредством атрибута, должно быть именем типа преобразователя пользовательского типа. Если этот атрибут применен, то в случае, когда процессор XAML обрабатывает значения, в которых тип свойства использует тип пользовательского класса, процессор может ввести строки и вернуть экземпляры объекта.

Можно также предоставить преобразователь типа на основе каждого свойства. Вместо применения Атрибут NET Framework TypeConverterAttribute к определению класса, следует применить его к определению свойства (главное определение, не реализации get/set внутри него). Тип свойства должен соответствовать типу, который обрабатывается пользовательским преобразователем типа. Если этот атрибут применен, то в случае, когда процессор XAML обрабатывает значения этого свойства, он может обработать входные строки и вернуть экземпляры объекта. Преобразователь типа каждого свойства особенно полезен в случае, если выбрано использование типа свойства из Microsoft .NET Framework или из какой-либо другой библиотеки, в которой нельзя управлять определением класса и нельзя применять TypeConverterAttribute.

См. также

Основные понятия

Общие сведения о XAML

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

Терминология синтаксиса XAML

Ссылки

TypeConverter