본문 바로가기

Development/WPF

WPF FlagTrigger(Enum Data Trigger)

Introduction

WPF Application을 개발할 때 XAML에서 값에 따라 속성를 바꾸거나 Animation을 시작하려고 할때 Trigger를 사용합니다. Trigger에는 종류가 여러가지가 있는데, 그중 DataTrigger는 Binding결과값에 따라 Setter를 처리하는 기능을 가지고 있습니다. DataTrigger는 기본적으로 Binding결과의 1:1매칭만 결과에 의존해 Setter를 처리하는데, 이렇게 되면 Enum데이터에 OR 연산으로 입력되어있는(Flag형태로되어 있는)데이터를 처리하기 위해서는 Converter를 사용해 처리하거나 DataTrigger부분을 두번 사용해야 합니다.

이번시간에는 DataTrigger를 이용해 Flag에 대응할 수 있는 FlagTrigger를 구현하는 방법에 대해 소개합니다.

Create FlagTrigger

FlagTrigger를 구현하기 위해 DataTrigger를 상속 받아보면 모든 Virtual Method가 Internal로 구현되어 있어 막상 개발자가 제어할 수 있는 부분이 없습니다. 하지만 다행히도 Binding객체에 접근할 수 있고 Binding 속성이 필수값이기 때문에 Converter와 Dispatcher를 적절히 사용하면 간단히 Custom Trigger를 구성 할 수 있습니다. 아래는 FlagTrigger의 전체 소스코드입니다.

위 코드에서 보는바와 같이 FlagTrigger는 크게 두부분으로 나뉘는데, 첫번째는 연결된 Binding객체에 내부적으로 처리할 ConverterWrapper를 적용해주는 부분. 그리고 두번째는 ConverterWrapper에서 결과를 처리하는 부분으로 나뉩니다.

Binding 객체의 기존 Converter를 ConverterWrapper로 교체하는 작업에서 Dispatcher를 사용한 이유는 생성자 호출시점에는 Binding객체가 존재 하지 않기 때문에 BeginInvoke를 통해 생성자 이후 시점에 다시한번 초기화 할수 있도록 유도하기 위합니다. 그리고 Binding 객체에 이미 Converter가 적용되어있을 수 있기 때문에 ConverterWrapper에서는 기존 Converter의 결과를 가지고 Flag를 위한 연산을 수행합니다.

실제 사용할 때에는 아래와 같이 Enum값을 구성을 하고,

XAML에서 아래와 같이 사용하시면 됩니다.

WidthOrHeight에는 Width와 Height가 OR연산으로 포함되어있기 때문에 Width, Height, WidthOrHeight 3가지 값에 대해서 Trigger가 동작하는것을 확인 할 수 있습니다. 아래는 이번시간에 사용된 전체 소스코드입니다. 기타 궁금하신 점이나 문의 사항은 댓글이나 메일 주시면 답변드리겠습니다.

WIT.WPF.FlagTriggerExample.zip