TypeConverter 및 XAML
이 항목에서는 문자열에서 형식 변환의 용도를 일반 XAML 언어 기능으로 소개합니다. .NET Framework에서 TypeConverter 클래스는 XAML 특성 사용에서 속성 값으로 사용할 수 있는 관리되는 사용자 지정 클래스 구현의 일부라는 특정 용도로 사용됩니다. 사용자 지정 클래스를 작성하는 경우 클래스의 인스턴스를 설정 가능한 XAML 특성 값으로 사용할 수 있도록 하려면 클래스에 TypeConverterAttribute을(를) 적용하거나, 사용자 지정 TypeConverter 클래스를 작성하거나, 둘 다를 수행해야 할 수 있습니다.
형식 변환 개념
XAML 및 문자열 값
XAML 파일에서 특성 값을 설정하는 경우 해당 값의 초기 형식은 일반 텍스트의 문자열입니다. Double과(와) 같은 다른 기본 형식도 처음에는 XAML 프로세서의 텍스트 문자열입니다.
XAML 프로세서에서 특성 값을 처리하려면 두 가지 정보가 필요합니다. 첫 번째 정보는 설정되는 속성의 값 형식입니다. 특성 값을 정의하고 XAML에서 처리되는 모든 문자열은 결국 해당 형식의 값으로 변환되거나 확인되어야 합니다. 값이 숫자 값과 같이 XAML 파서에서 인식되는 기본 형식인 경우 문자열의 직접 변환이 시도됩니다. 값이 열거형인 경우에는 문자열은 이름이 해당 열거형에 명명된 상수와 일치하는지 확인하는 데 사용됩니다. 값이 파서에서 인식되는 기본 형식이나 열거형이 아닌 경우 해당 형식은 변환된 문자열에 따라 형식의 인스턴스나 값을 제공할 수 있어야 합니다. 이렇게 하려면 형식 변환기 클래스를 지정합니다. 실제로 형식 변환기는 XAML 시나리오와 .NET 코드의 코드 호출에서 다른 클래스의 값을 제공하기 위한 도우미 클래스입니다.
XAML에서 기존 형식 변환 동작 사용
기본 XAML 개념에 대한 숙련도에 따라 자신도 모르게 기본 애플리케이션 XAML에서 형식 변환 동작을 이미 사용하고 있을 수 있습니다. 예를 들어 WPF는Point 형식의 값을 사용하는 수백 가지 속성을 정의합니다. Point은(는) 2차원 좌표 공간의 좌표를 설명하는 값이며 실제로 두 가지 중요한 속성인 X 및 Y이(가) 있습니다. XAML에서 점을 지정하는 경우 제공하는 X 및 Y 값 사이에 구분 기호(일반적으로 쉼표)가 있는 문자열로 지정합니다. 예를 들어 <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이 있습니다. 이유는 DateTime 형식이 .NET에서 가장 기본적인 라이브러리인 mscorlib에서 정의되는 .NET Framework 아키텍처의 작동 방식을 기반으로 합니다. DateTime은(는) 종속성을 도입하는 다른 어셈블리에서 제공하는 특성을 사용할 수 없습니다(TypeConverterAttribute은(는) 시스템 제공). 따라서 특성을 사용하는 일반적인 형식 변환기 검색 메커니즘을 지원할 수 없습니다. 대신 XAML 파서에 이러한 네이티브 처리가 필요한 형식 목록이 있으며 실제 기본 형식이 처리되는 방법과 유사한 방법으로 이러한 형식을 처리합니다. (DateTime의 경우 이는 Parse에 대한 호출이 포함됩니다.)
형식 변환기 구현
TypeConverter
이전에 제공된 Point 예제에서 클래스 PointConverter이(가) 언급되었습니다. XAML의 .NET 구현의 경우 XAML 용도에 사용되는 모든 형식 변환기는 기본 클래스 TypeConverter에서 파생되는 클래스입니다. TypeConverter 클래스는 XAML이 존재하기 이전의 .NET Framework 버전에 있었으며, 원래 용도 중 하나는 비주얼 디자이너의 속성 대화 상자에서 문자열 변환을 제공하는 것입니다. XAML에서는 TypeConverter의 역할이 to-string 및 from-string 변환을 위한 기본 클래스를 포함하도록 확장되었습니다. 따라서 문자열 특성 값을 구문 분석하고 특정 개체 속성의 런타임 값을 문자열로 다시 처리하여 특성으로 serialization할 수 있습니다.
TypeConverter은(는) XAML 처리를 위한 to 및 from 문자열 변환과 관련된 네 가지 멤버를 정의합니다.
이 중에서 가장 중요한 방법은 ConvertFrom입니다. 이 메서드는 입력 문자열을 필요한 개체 형식으로 변환합니다. 엄격히 말해 ConvertFrom 메서드는 훨씬 더 광범위한 형식을 변환기의 의도된 대상 형식으로 변환하도록 구현할 수 있습니다. 따라서 런타임 변환 지원과 같이 XAML 이상으로 확장되는 용도로 사용할 수 있지만 XAML 용도에서는 String 입력을 처리할 수 있는 코드 경로로만 중요합니다.
이 중에서 가장 중요한 메서드는 ConvertTo입니다. 애플리케이션이 태그 표현으로 변환되는 경우(예: 파일로 XAML에 저장되는 경우) ConvertTo은(는) 태그 표현 생성을 담당합니다. 이 경우 XAML에서 중요한 코드 경로는 String의 destinationType
을 전달할 때입니다.
CanConvertTo 및 CanConvertFrom 은 서비스에서 TypeConverter 구현의 기능을 쿼리할 때 사용되는 지원 메서드입니다. 변환기의 동일한 변환 메서드에서 지원하는 형식 관련 케이스에 대해 true
를 반환하려면 이러한 메서드를 구현해야 합니다. XAML 용도에서는 일반적으로 String 형식을 의미합니다.
XAML에 대한 문화권 정보 및 형식 변환기
각 TypeConverter 구현에서는 변환에 유효한 문자열을 구성하는 항목을 고유하게 해석할 수 있으며 매개 변수로 전달되는 형식 설명을 사용하거나 무시할 수도 있습니다. 문화권 및 XAML 형식 변환과 관련하여 중요한 고려 사항이 있습니다. XAML에서는 지역화 가능 문자열을 특성 값으로 사용할 수 있습니다. 그러나 해당 지역화 가능 문자열을 특정 문화권 요구 사항이 있는 형식 변환기 입력으로 사용할 수는 없습니다. XAML 특성 값에 대한 형식 변환기에는 en-US
문화권을 사용하는 고정 언어 구문 분석 동작이 반드시 포함되기 때문입니다. 이러한 제한의 디자인상 이유에 대한 자세한 내용은 XAML 언어 사양([MS-XAML])을 참조하세요.
문화권이 문제가 될 수 있는 경우에 대한 예로 일부 문화권에서는 숫자에 대한 소수점 구분 기호로 쉼표를 사용합니다. 이러한 사용은 일반적인 X,Y 형식이나 쉼표로 구분된 목록 같은 역사적 선례에 따라 쉼표를 구분 기호로 사용하는 많은 WPF XAML 형식 변환기의 동작과 충돌합니다. 주변 XAML에서 Language
또는 xml:lang
을 sl-SI
문화권(이런 식으로 소수점에 쉼표를 사용하는 문화권의 예)으로 설정하여 문화권을 전달해도 문제가 해결되지 않습니다.
ConvertFrom 구현
XAML을 지원하는 TypeConverter 구현으로 사용하려면 해당 변환기에 대한 ConvertFrom 메서드에서 문자열을 value
매개 변수로 허용해야 합니다. 문자열이 올바른 형식이었고 TypeConverter 구현으로 변환할 수 있는 경우 반환된 개체가 속성에 필요한 형식으로 캐스트를 지원해야 합니다. 그렇지 않은 경우 ConvertFrom 구현에서 null
을 반환해야 합니다.
각 TypeConverter 구현에서는 변환에 유효한 문자열을 구성하는 항목을 고유하게 해석할 수 있으며 매개 변수로 전달되는 형식 설명이나 문화권 컨텍스트를 사용하거나 무시할 수도 있습니다. 그러나 WPF XAML 처리에서 모든 경우의 형식 설명 컨텍스트에 값을 전달할 수는 없으며 xml:lang
을 기반으로 하는 문화권을 전달할 수도 없습니다.
참고
중괄호 문자, 특히 {를 문자열 형식의 가능한 요소로 사용하지 마세요. 이러한 문자는 태그 확장명 시퀀스의 시작 및 종료로 예약되어 있습니다.
ConvertTo 구현
ConvertTo 는 serialization 지원에 잠재적으로 사용됩니다. ConvertTo 를 통해 사용자 지정 형식 및 해당 형식 변환기에 대해 Serialization을 지원하는 것은 절대적인 요구 사항이 아닙니다. 그러나 컨트롤을 구현하거나 클래스의 디자인 또는 기능의 일부로 serialization을 사용하는 경우에는 ConvertTo를 구현해야 합니다.
XAML을 지원하는 TypeConverter 구현으로 사용하려면 해당 변환기에 대한 ConvertTo 메서드에서 value
매개 변수로 지원되는 형식(또는 값)의 인스턴스를 허용해야 합니다. destinationType
매개 변수가 String형식인 경우 반환된 개체는 String(으)로 캐스트될 수 있어야 합니다. 반환된 문자열은 value
의 직렬화된 값을 나타내야 합니다. 이상적으로 선택한 serialization 형식은 해당 문자열이 동일한 변환기의 ConvertFrom 구현에 전달된 경우와 동일한 값을 생성할 수 있어야 하며 정보가 크게 손실되지 않아야 합니다.
값을 직렬화할 수 없거나 변환기에서 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을(를) 적용할 수 없는 일부 다른 라이브러리에서 속성 형식을 사용하도록 선택하는 경우에 특히 유용합니다.
참조
.NET Desktop feedback