TypeConverter 및 XAML

이 항목에서는 문자열에서 형식 변환의 용도를 일반 XAML 언어 기능으로 소개합니다. .NET Framework TypeConverter 클래스는 XAML 특성 사용에서 속성 값으로 사용할 수 있는 관리되는 사용자 지정 클래스에 대한 구현의 일부로 특정 용도로 사용됩니다. 사용자 지정 클래스를 작성하고 클래스의 인스턴스를 XAML 설정 가능 특성 값으로 사용할 수 있도록 하려면 클래스에 적용 TypeConverterAttribute 하거나 사용자 지정 TypeConverter 클래스를 작성하거나 둘 다 작성해야 할 수 있습니다.

형식 변환 개념

XAML 및 문자열 값

XAML 파일에서 특성 값을 설정하는 경우 해당 값의 초기 형식은 일반 텍스트의 문자열입니다. XAML 프로세서에 대한 초기 텍스트 문자열과 같은 Double 다른 기본 형식도 있습니다.

XAML 프로세서에서 특성 값을 처리하려면 두 가지 정보가 필요합니다. 첫 번째 정보는 설정되는 속성의 값 형식입니다. 특성 값을 정의하고 XAML에서 처리되는 모든 문자열은 결국 해당 형식의 값으로 변환되거나 확인되어야 합니다. 값이 숫자 값과 같이 XAML 파서에서 인식되는 기본 형식인 경우 문자열의 직접 변환이 시도됩니다. 값이 열거형인 경우에는 문자열은 이름이 해당 열거형에 명명된 상수와 일치하는지 확인하는 데 사용됩니다. 값이 파서에서 인식되는 기본 형식이나 열거형이 아닌 경우 해당 형식은 변환된 문자열에 따라 형식의 인스턴스나 값을 제공할 수 있어야 합니다. 이렇게 하려면 형식 변환기 클래스를 지정합니다. 실제로 형식 변환기는 XAML 시나리오와 .NET 코드의 코드 호출에서 다른 클래스의 값을 제공하기 위한 도우미 클래스입니다.

XAML에서 기존 형식 변환 동작 사용

기본 XAML 개념에 대한 숙련도에 따라 자신도 모르게 기본 애플리케이션 XAML에서 형식 변환 동작을 이미 사용하고 있을 수 있습니다. 예를 들어 WPF는 형식 Point값을 사용하는 수백 개의 속성을 문자 그대로 정의합니다. A Point 는 2차원 좌표 공간의 좌표를 설명하는 값이며 실제로 두 가지 X 중요한 속성만 Y있습니다. XAML에서 점을 지정하는 경우 제공하는 값과 XY 구분 기호(일반적으로 쉼표)가 있는 문자열로 지정합니다. 예: <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"/>

이 간단한 형식과 XAML에서의 Point 간단한 사용에도 형식 변환기가 포함됩니다. 이 경우 클래스 PointConverter입니다.

클래스 수준에서 정의된 형식 변환기는 Point 사용하는 모든 속성 Point의 태그 사용을 간소화합니다. 형식 변환기를 사용하지 않을 경우 위에 나온 동일한 예제에 훨씬 더 자세한 다음과 같은 태그가 필요합니다.

<LinearGradientBrush>
  <LinearGradientBrush.StartPoint>
    <Point X="0" Y="0"/>
  </LinearGradientBrush.StartPoint>
  <LinearGradientBrush.EndPoint>
    <Point X="1" Y="1"/>
  </LinearGradientBrush.EndPoint>
</LinearGradientBrush>

형식 변환 문자열을 사용할지 보다 자세한 해당 구문을 사용할지 여부는 일반적으로 코딩 스타일에 따라 선택됩니다. XAML 도구 워크플로도 값 설정 방법에 영향을 줄 수 있습니다. 일부 XAML 도구는 디자이너 뷰 또는 고유한 serialization 메커니즘을 더 쉽게 왕복하기 때문에 가장 자세한 형식의 태그를 내보내는 경향이 있습니다.

기존 형식 변환기는 일반적으로 적용된 클래스(또는 속성)TypeConverterAttribute를 확인하여 WPF 및 .NET Framework 형식에서 검색할 수 있습니다. 이 특성은 XAML 용도 및 기타 가능한 용도에서 해당 형식의 값을 지원하는 형식 변환기인 클래스의 이름을 지정합니다.

형식 변환기 및 태그 확장명

태그 확장 및 형식 변환기는 적용되는 시나리오 및 XAML 프로세서 동작 측면에서 직교 역할을 채웁니다. 태그 확장 사용에 컨텍스트를 사용할 수는 있지만 태그 확장에서 값을 제공하는 속성의 형식 변환 동작은 일반적으로 태그 확장 구현에서 확인되지 않습니다. 즉, 태그 확장에서 텍스트 문자열을 해당 ProvideValue 출력으로 반환하는 경우에도 특정 속성이나 속성 값 형식에 적용될 때 해당 문자열의 형식 변환 동작은 호출되지 않습니다. 일반적으로 태그 확장의 목적은 문자열을 처리하고 관련된 형식 변환기 없이 개체를 반환하는 것입니다.

형식 변환기가 아니라 태그 확장이 필요한 일반적인 상황은 이미 존재하는 개체에 대한 참조를 만드는 경우입니다. 기껏해야 상태 비저장 형식 변환기만 새 인스턴스를 생성할 수 있으며, 이는 바람직하지 않을 수 있습니다. 태그 확장에 대한 자세한 내용은 태그 확장 및 WPF XAML을 참조하세요.

네이티브 형식 변환기

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

형식 변환기 구현

TypeConverter

이전에 제공된 Point 예제에서 클래스 PointConverter 가 언급되었습니다. XAML의 .NET 구현의 경우 XAML 용도로 사용되는 모든 형식 변환기는 기본 클래스에서 파생되는 클래스 TypeConverter입니다. 클래스는 TypeConverter XAML이 존재하기 전에 .NET Framework 버전에 존재했습니다. 원래 사용법 중 하나는 비주얼 디자이너에서 속성 대화 상자에 대한 문자열 변환을 제공하는 것이었습니다. XAML의 경우 문자열 특성 값을 구문 분석하고 특정 개체 속성의 TypeConverter 런타임 값을 특성으로 serialization을 위해 문자열로 다시 처리할 수 있는 문자열 간 변환의 기본 클래스가 되는 역할을 포함하도록 확장됩니다.

TypeConverter 는 XAML 처리를 위해 문자열로 변환 및 변환과 관련된 4개의 멤버를 정의합니다.

이 중에서 가장 중요한 방법은 .입니다 ConvertFrom. 이 메서드는 입력 문자열을 필요한 개체 형식으로 변환합니다. 엄밀히 말해, ConvertFrom 이 메서드는 훨씬 더 광범위한 형식을 변환기의 의도된 대상 형식으로 변환하기 위해 구현할 수 있으므로 런타임 변환 지원과 같이 XAML 이상으로 확장되는 용도로 사용할 수 있지만 XAML 용도로는 중요한 입력을 처리 String 할 수 있는 코드 경로일 뿐입니다.

다음으로 가장 중요한 방법은 .입니다 ConvertTo. 애플리케이션이 태그 표현으로 변환되는 경우(예: XAML에 파일로 저장되는 경우) ConvertTo 태그 표현을 생성해야 합니다. 이 경우 XAML에 중요한 코드 경로는 다음을 String 전달할 destinationType 때입니다.

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

XAML에 대한 문화권 정보 및 형식 변환기

TypeConverter 구현은 변환에 유효한 문자열을 구성하는 항목에 대한 자체 해석을 가질 수 있으며 매개 변수로 전달된 형식 설명을 사용하거나 무시할 수도 있습니다. 문화권 및 XAML 형식 변환과 관련하여 중요한 고려 사항이 있습니다. XAML에서는 지역화 가능 문자열을 특성 값으로 사용할 수 있습니다. 그러나 해당 지역화 가능 문자열을 특정 문화권 요구 사항이 있는 형식 변환기 입력으로 사용할 수는 없습니다. XAML 특성 값에 대한 형식 변환기에는 en-US 문화권을 사용하는 고정 언어 구문 분석 동작이 반드시 포함되기 때문입니다. 이 제한에 대한 디자인 이유에 대한 자세한 내용은 XAML 언어 사양([MS-XAML])을 참조하세요.

문화권이 문제가 될 수 있는 경우에 대한 예로 일부 문화권에서는 숫자에 대한 소수점 구분 기호로 쉼표를 사용합니다. 이러한 사용은 일반적인 X,Y 형식이나 쉼표로 구분된 목록 같은 역사적 선례에 따라 쉼표를 구분 기호로 사용하는 많은 WPF XAML 형식 변환기의 동작과 충돌합니다. 주변 XAML에서 Language 또는 xml:langsl-SI 문화권(이런 식으로 소수점에 쉼표를 사용하는 문화권의 예)으로 설정하여 문화권을 전달해도 문제가 해결되지 않습니다.

ConvertFrom 구현

XAML을 지원하는 TypeConverter 구현으로 사용하려면 해당 변환기에 대한 ConvertFrom 메서드에서 문자열을 value 매개 변수로 허용해야 합니다. 문자열이 유효한 형식이고 구현에서 TypeConverter 변환할 수 있는 경우 반환된 개체는 속성에 필요한 형식으로 캐스트를 지원해야 합니다. 그렇지 않은 경우 ConvertFrom 구현에서 null을 반환해야 합니다.

TypeConverter 구현은 변환에 유효한 문자열을 구성하는 항목에 대한 자체 해석을 가질 수 있으며 매개 변수로 전달된 형식 설명 또는 문화권 컨텍스트를 사용하거나 무시할 수도 있습니다. 그러나 WPF XAML 처리에서 모든 경우의 형식 설명 컨텍스트에 값을 전달할 수는 없으며 xml:lang을 기반으로 하는 문화권을 전달할 수도 없습니다.

참고

중괄호 문자, 특히 {를 문자열 형식의 가능한 요소로 사용하지 마세요. 이러한 문자는 태그 확장명 시퀀스의 시작 및 종료로 예약되어 있습니다.

ConvertTo 구현

ConvertTo 는 serialization 지원에 잠재적으로 사용됩니다. ConvertTo 를 통해 사용자 지정 형식 및 해당 형식 변환기에 대해 Serialization을 지원하는 것은 절대적인 요구 사항이 아닙니다. 그러나 컨트롤을 구현하거나 클래스의 디자인 또는 기능의 일부로 serialization을 사용하는 경우에는 ConvertTo를 구현해야 합니다.

XAML ConvertToTypeConverter 지원하는 구현으로 사용하려면 해당 변환기의 메서드가 매개 변수로 value 지원되는 형식(또는 값)의 인스턴스를 수락해야 합니다. 매개 변수가 destinationType 형식 String인 경우 반환된 개체를 .로 String캐스팅할 수 있어야 합니다. 반환된 문자열은 value의 직렬화된 값을 나타내야 합니다. 선택한 serialization 형식은 해당 문자열이 상당한 정보 손실 없이 동일한 변환기의 구현에 전달된 경우 동일한 값을 생성할 ConvertFrom 수 있어야 합니다.

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

destinationType 매개 변수가 형식String이 아니면 사용자 고유의 변환기 처리를 선택할 수 있습니다. 일반적으로 기본 구현 처리로 되돌려지며, 기본 ConvertTo 구현 처리에서 특정 예외가 발생합니다.

CanConvertTo 구현

CanConvertTo 구현은 true 형식의 destinationType 에 대해 String를 반환하고, 그렇지 않은 경우 기본 구현에서 결정합니다.

CanConvertFrom 구현

CanConvertFrom 구현은 true 형식의 sourceType 에 대해 String를 반환하고, 그렇지 않은 경우 기본 구현에서 결정합니다.

TypeConverterAttribute 적용

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

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

참조