본문 바로가기

Development/WPF

ValueSelector MarkupExtension

Introduction

WPF에서 Binding결과값을 다른 값으로 변환하기 위해 Converter를 사용합니다. 일반적으로 Converter를 구현하기 위해 개발자는 IValueConverter를 상속받은 객체를 구현하고 리소스로 등록하여  사용합니다. 아래 코드는 ValueConverter를 이용해 Slider의 Value에 따라 TextBlock의 FontSize를 변환하는 샘플 코드입니다.


그런데 필요에 따라 Converter를 매번 구현하게 되면  필요 이상으로 Converter를 위한 Type 이 너무 많아지는 상황이 발생합니다. 이렇게 되면 Converter의 경우 XAML코드가 아니기 때문에 관리상으로도 어려움을 격게 됩니다.  이번시간에는 단순한 값 변환을 위해 ValueConverter를 이용하지 않고 XAML코드에서 처리가능하도록 하는 MarkupExtension을 구현하는 방법에 대해 소개합니다.

Create ValueSelectorExtension

ValueSelectorExtension을 구현하기 위해서 먼저 MarkupExtension 형식의 객체를 구현해야합니다. 이때 ValueSelector의 기준이 되는 값이 Binding결과가 될거기 때문에 간단히 Binding객체를 상속받고 ValueConverter또한 상속받는 구조로 아래와 같이 정의합니다.

ValueSelectorExtension은 Selector들을 통해 현재 값에 대한 Converter를 유동적으로 선택 할 수 있고 매칭되는 Selector를 통해 값을 변환 해주게 됩니다. 이제 여러가지 상황을 대응 할 수 있는 Selector만 임의로 구현하면 되는데요, Selector를 구현 할 때는 아래와 같이 구현 할 수 있습니다.

RangeSelector는 사용자가 입력한 범위에 따라 결과값을 지정해 줄 수 있습니다.  위와 같이 Selector를 구현하고 실제 XAML에서 사용할 때에는 아래와 같이 사용할 수 있습니다.


RangeSelector이외에도 용도에 맞게 BooleanSelector, TypeSelector 등을 구현한다면 많은 상황에 대응할 수 있는 Converter를 매번 만들지 않고도 대응 할 수 있습니다.  이상으로 이번 포스팅을 마치며 아래 첨부파일은 ValueSelectorExtension예제 파일입니다. 기타 궁금하신 점이나 문의사항은 이메일이나 댓글로 남겨주시면 답변드리도록 하겠습니다. 감사합니다.

WIT.WPF.ValueSelectorExample.zip