다음을 통해 공유


XAML을 위한 형식 변환기 개요

형식 변환기는 XAML 태그의 문자열을 개체 그래프의 특정 개체로 변환하는 개체 작성기에 대한 논리를 제공합니다. .NET Framework XAML 서비스에서 형식 변환기는 TypeConverter에서 파생된 클래스여야 합니다. 또한 일부 변환기는 XAML 저장 경로를 지원하며 serialization 태그에서 문자열 형태로 개체를 serialize하는 데 사용할 수 있습니다. 이 항목에서는 XAML의 형식 변환기가 호출되는 방법 및 시기에 대해 설명하고 TypeConverter의 메서드 재정의에 대한 구현 권장 사항을 제공합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

  • 형식 변환 개념
  • 형식 변환기 구현
  • TypeConverterAttribute 적용
  • 태그 확장 구현에서 서비스 공급자 컨텍스트에 액세스
  • XAML 노드 스트림의 형식 변환기
  • 관련 항목

형식 변환 개념

다음 단원에서는 XAML에서 문자열을 사용하는 방법과 .NET Framework XAML 서비스의 개체 작성기가 형식 변환기를 사용하여 XAML 소스에서 발견된 문자열 값의 일부를 처리하는 방법에 대한 기본적인 개념을 설명합니다.

XAML 및 문자열 값

XAML 파일에서 특성 값을 설정할 때 적용되는 초기 값 형식은 일반적인 경우 문자열이고 XML의 경우 문자열 특성 값입니다. Double과 같은 다른 기본 형식들도 처음에는 XAML 프로세서에 대해 문자열입니다.

대부분의 경우 XAML 프로세서에서 특성 값을 처리하려면 두 가지 정보가 있어야 합니다. 그 중 하나는 설정할 속성의 값 형식입니다. 특성 값을 정의하며 XAML에서 처리되는 모든 문자열은 궁극적으로 이 형식의 값으로 변환되거나 확인되어야 합니다. 값이 XAML 파서가 이해하는 기본 형식(예: 숫자 값)이면 문자열을 직접 변환하려고 합니다. 특성의 값이 열거형을 참조하는 경우 제공된 문자열을 사용하여 해당 열거형에서 일치하는 명명된 상수가 있는지 확인합니다. 값이 파서가 이해하는 기본 형식도 아니고 열거형의 상수 이름도 아닌 경우 해당 형식은 변환된 문자열 기반의 참조나 값을 제공할 수 있어야 합니다.

참고참고

XAML 언어 지시문은 형식 변환기를 사용하지 않습니다.

형식 변환기 및 태그 확장

태그 확장 사용은 속성 형식 및 다른 고려 사항을 확인하기 전에 XAML 프로세서를 통해 처리되어야 합니다. 예를 들어 일반적인 특성으로 설정되는 속성에 형식 변환이 있지만 태그 확장 사용에 의해 설정되는 특정한 경우에는 태그 확장 동작이 먼저 처리됩니다. 일반적으로 태그 확장이 필요한 경우는 이미 있는 개체를 참조하는 경우입니다. 이 시나리오의 경우 상태 비저장 형식 변환기는 새 인스턴스만 생성할 수 있으며 이는 바람직하지 않을 수도 있습니다. 태그 확장에 대한 자세한 내용은 XAML 태그 확장 개요를 참조하십시오.

네이티브 형식 변환기:

WPF 및 .NET XAML 서비스 구현에서 일부 CLR 형식에는 네이티브 형식 변환 처리 기능이 있지만 일반적으로 이러한 CRL 형식은 기본 형식으로 간주되지 않습니다. 이러한 형식의 예로는 DateTime이 있습니다. 이에 대한 한 가지 이유는 .NET Framework 아키텍처의 작동 방식 때문입니다. DateTime 형식은 .NET의 가장 기본적인 라이브러리인 mscorlib에서 정의됩니다. DateTime의 경우 TypeConverterAttribute가 속한 System 어셈블리 이외의 다른 어셈블리에 속하는 특성을 사용하면 어셈블리가 종속되게 되므로 이러한 특성을 지정할 수 없습니다. 따라서 특성을 사용한 일반적인 형식 변환기 검색 메커니즘을 지원할 수 없습니다. 대신 XAML 파서는 기본 처리가 필요한 형식의 목록을 갖고 있으며 실제 기본 형식이 처리되는 방식과 유사하게 이러한 형식을 처리합니다. DateTime의 경우 이 처리에는 Parse 호출이 포함됩니다.

형식 변환기 구현

다음 단원에서는 TypeConverter 클래스의 API에 대해 설명합니다.

TypeConverter

.NET Framework XAML 서비스에서 XAML 용도로 사용되는 모든 형식 변환기는 기본 클래스인 TypeConverter에서 파생되는 클래스입니다. TypeConverter 클래스는 XAML이 도입되기 전의 .NET Framework 버전에도 있었으며, TypeConverter 클래스의 원래 용도 중 하나는 비주얼 디자이너에서 속성 편집기에 문자열 변환 기능을 제공하는 것이었습니다.

XAML에서 TypeConverter의 역할은 확장되었습니다. XAML에 사용되는 경우 TypeConverter는 특정 문자열로 변환 및 문자열에서 변환을 위한 기본 클래스입니다. 문자열에서 변환을 통해 XAML에서 문자열 특성 값을 구문 분석할 수 있습니다. 문자열로 변환을 통해서는 특정 개체 속성의 런타임 값을 serialization을 위해 XAML에서 특성으로 다시 처리할 수 있습니다.

TypeConverter는 XAML 처리를 위한 문자열로 변환 및 문자열에서 변환과 관련된 네 가지 멤버를 정의합니다.

이러한 멤버 중에서 가장 중요한 메서드는 입력 문자열을 필요한 개체 형식으로 변환하는 ConvertFrom입니다. ConvertFrom 메서드는 더 넓은 범위의 형식을 변환기의 원하는 대상 형식으로 변환하기 위해 구현될 수 있습니다. 따라서 런타임 변환 지원과 같은 XAML을 벗어나는 용도로 이 메서드를 사용할 수 있습니다. 그러나 XAML 용도를 위해서는 String 입력을 처리할 수 있는 코드 경로만 중요합니다.

그 다음으로 중요한 메서드는 ConvertTo입니다. 응용 프로그램을 태그 표현으로 변환하는 경우(예를 들어 응용 프로그램을 파일로 XAML에 저장하는 경우) ConvertTo는 XAML 텍스트 작성기가 태그 표현을 생성하는 대규모 시나리오에서 사용됩니다. 이 경우 XAML에 중요한 코드 경로는 호출자가 String의 destinationType을 전달할 때입니다.

CanConvertToCanConvertFrom은 서비스에서 TypeConverter 구현의 기능을 쿼리할 때 사용되는 지원 메서드입니다. 이러한 메서드는 변환기와 동등한 변환 메서드가 지원하는 형식과 관련된 경우에 true를 반환하도록 구현해야 합니다. XAML 용도를 위해 이는 일반적으로 String 형식을 의미합니다.

XAML의 문화권 정보 및 형식 변환기

TypeConverter 구현은 변환할 유효한 문자열을 고유하게 해석할 수 있으며 매개 변수로 전달된 형식 설명을 사용하거나 무시할 수도 있습니다. 문화권과 XAML 형식 변환에 중요한 고려 사항은 다음과 같습니다. 지역화 가능한 문자열을 XAML에서 특성 값으로 사용할 수 있지만 특정한 문화권 요구 사항이 있는 형식 변환기 입력으로는 사용할 수 없습니다. 이러한 제한은 XAML 특성 값에 대한 형식 변환기가 en-US 문화권을 사용하므로 반드시 수정해야 하는 언어 XAML 처리 동작과 관련이 있기 때문에 적용됩니다. 이러한 제한의 디자인 이유에 대한 자세한 내용은 XAML 언어 사양([MS-XAML]) 또는 WPF 전역화 및 지역화 개요를 참조하십시오.

문화권이 문제가 될 수 있는 예로 문자열 형식의 숫자에 대한 소수점 구분 기호로 마침표 대신 쉼표를 사용하는 일부 문화권을 들 수 있습니다. 이는 쉼표를 구분 기호로 사용하는 많은 기존 형식 변환기의 동작과 충돌합니다. XAML로 묶어 xml:lang를 통해 문화권을 전달하는 방법으로는 이 문제가 해결되지 않습니다.

ConvertFrom 구현

XAML을 지원하는 TypeConverter 구현으로 사용할 수 있으려면 해당 변환기의 ConvertFrom 메서드가 문자열을 value 매개 변수로 받아들여야 합니다. 문자열의 형식이 올바르고 TypeConverter 구현을 통해 변환될 수 있으면 반환된 개체를 속성에 필요한 형식으로 캐스팅할 수 있어야 합니다. 그렇지 않으면 ConvertFrom 구현이 null을 반환해야 합니다.

TypeConverter 구현은 변환할 유효한 문자열을 구성하는 요소를 고유하게 해석할 수 있으며 매개 변수로 전달된 형식 설명이나 문화권 컨텍스트를 사용하거나 무시할 수도 있습니다. 하지만 어떤 경우에 해당하든 WPF XAML 처리에서 형식 설명 컨텍스트에 값을 전달하지 않거나 xml:lang를 기반으로 문화권을 전달하지 않을 수도 있습니다.

참고참고

문자열 형식의 요소로 중괄호({}), 특히 여는 중괄호({)는 사용하지 마십시오.이러한 문자는 태그 확장 시퀀스의 시작과 끝에 사용하도록 예약되어 있습니다.

형식 변환기가 .NET Framework XAML 서비스 개체 작성기에서 XAML 서비스에 액세스할 수 있어야 하지만 컨텍스트에 대해 수행된 GetService 호출이 해당 서비스를 반환하지 않는 경우 예외를 throw하는 것이 적합합니다.

ConvertTo 구현

ConvertTo는 serialization을 지원하기 위해 사용됩니다. 사용자 지정 형식과 해당 형식 변환기에 대한 ConvertTo를 통한 serialization 지원은 필수 요구 사항이 아닙니다. 하지만 컨트롤을 구현하거나 클래스의 기능 또는 디자인의 일부로 serialization을 사용하는 경우에는 ConvertTo를 구현해야 합니다.

XAML을 지원하는 TypeConverter 구현으로 사용할 수 있으려면 해당 변환기의 ConvertTo 메서드가 지원되는 형식 또는 값의 인스턴스를 value 매개 변수로 받아들여야 합니다. destinationType 매개 변수가 String 형식이면 반환된 개체를 String으로 캐스팅할 수 있어야 합니다. 반환된 문자열은 value의 serialize된 값을 나타내야 합니다. serialization 형식을 선택할 때, 동일한 변환기의 ConvertFrom 구현에 문자열이 전달된 것처럼 중요한 정보를 손실하지 않고 동일한 값을 생성할 수 있는 형식을 선택하는 것이 가장 좋습니다.

값을 serialize할 수 없거나 변환기가 serialization을 지원하지 않는 경우 ConvertTo 구현에서는 null을 반환해야 하며 예외를 throw할 수 있습니다. 그러나 예외를 throw하는 경우 CanConvertTo 구현의 일부로 변환을 사용할 수 없음을 보고하여 예외를 방지하기 위해 먼저 CanConvertTo를 사용하여 확인하는 최선의 방법이 지원되도록 해야 합니다.

destinationType 매개 변수가 String 형식이 아닌 경우 고유 변환기 처리를 선택할 수 있습니다. 일반적으로는 기본 구현 처리로 되돌리게 되는데 기본 구현 처리에서는 기본 ConvertTo가 특정 예외를 발생시킵니다.

형식 변환기가 .NET Framework XAML 서비스 개체 작성기에서 XAML 서비스에 액세스할 수 있어야 하지만 컨텍스트에 대해 수행된 GetService 호출이 해당 서비스를 반환하지 않는 경우 예외를 throw하는 것이 적합합니다.

CanConvertFrom 구현

CanConvertFrom 구현은 sourceType 형식이 String이면 true를 반환하고, 그렇지 않으면 기본 구현을 따라야 합니다. CanConvertFrom에서 예외를 throw하지 마십시오.

CanConvertTo 구현

CanConvertTo 구현은 destinationType 형식이 String이면 true를 반환하고, 그렇지 않으면 기본 구현을 따라야 합니다. CanConvertTo에서 예외를 throw하지 마십시오.

TypeConverterAttribute 적용

.NET Framework XAML 서비스에서 사용자 지정 형식 변환기를 사용자 지정 클래스의 형식 변환기로 사용하도록 하려면 클래스 정의에 .NET Framework attribute TypeConverterAttribute를 적용해야 합니다. 특성을 통해 지정하는 ConverterTypeName은 사용자 지정 형식 변환기의 형식 이름이어야 합니다. 이 특성을 적용하면 속성 형식에 사용자 지정 클래스 형식이 사용되는 경우 XAML 프로세서가 값을 처리할 때 문자열을 입력하고 개체 인스턴스를 반환할 수 있습니다.

속성별로 형식 변환기를 제공할 수도 있습니다. 이 경우 .NET Framework attribute TypeConverterAttribute를 클래스 정의에 적용하는 대신 속성 정의(기본 정의 내의 get/set 구현이 아닌 기본 정의)에 적용합니다. 속성 형식은 사용자 지정 형식 변환기를 통해 처리되는 형식과 일치해야 합니다. 이 특성을 적용하면 XAML 프로세서가 속성 값을 처리할 때 입력 문자열을 처리하고 개체 인스턴스를 반환할 수 있습니다. 속성별로 형식 변환기를 제공하는 방법은 특히 클래스 정의를 제어할 수 없거나 클래스 정의에 TypeConverterAttribute를 적용할 수 없는 일부 다른 라이브러리 또는 Microsoft .NET Framework의 속성 형식을 사용하는 경우 유용합니다.

연결된 사용자 지정 멤버에 형식 변환 동작을 제공하려면 연결된 멤버에 대한 구현 패턴의 Get 메서드 접근자에 TypeConverterAttribute를 적용합니다.

태그 확장 구현에서 서비스 공급자 컨텍스트에 액세스

사용 가능한 서비스는 모든 값 변환기에 대해 동일합니다. 각 값 변환기가 서비스 컨텍스트를 수신하는 방법에는 차이가 있습니다. 서비스 액세스 방법 및 사용 가능한 서비스는 XAML을 위한 형식 변환기 및 태그 확장 항목에 설명되어 있습니다.

XAML 노드 스트림의 형식 변환기

XAML 노드 스트림을 사용하여 작업하는 경우 형식 변환기의 동작 또는 최종 결과가 아직 실행되지 않습니다. 로드 경로에서 로드하기 위해 결국 형식이 변환되어야 하는 특성 문자열은 시작 멤버와 종료 멤버 내에서 텍스트 값으로 유지됩니다. 이 작업에 최종적으로 필요한 형식 변환기는 XamlMember.TypeConverter 속성을 사용하여 결정할 수 있습니다. 그러나 XamlMember.TypeConverter에서 유효한 값을 가져오려면 XAML 스키마 컨텍스트가 있어야 합니다. XAML 스키마 컨텍스트에서는 기본 멤버를 통해서나 기본 멤버가 사용하는 개체 값의 형식을 통해 해당 정보에 액세스할 수 있습니다. 또한 형식 변환 동작을 호출하려면 변환기 인스턴스를 만들고 형식을 매핑해야 하기 때문에 XAML 스키마 컨텍스트가 필요합니다.

참고 항목

참조

TypeConverterAttribute

개념

XAML 개요(WPF)

기타 리소스

XAML을 위한 형식 변환기 및 태그 확장