본문 바로가기

Development/WPF

Markup Extension for CommandBinding with RoutedEvent

Introduction

MVVM 패턴등을 이용해 Application을 개발할때 View에서 호출되는 RoutedEvent를 처리하는데 있어 몇가지 이슈가 발생하게 됩니다. 일반적인 방법으로 RoutedEvent를 Command로 연결하기 위해서는 View와 ViewModel간의 종속적인관계가 유지 View와 ViewModel의 분리를 원칙으로하는 MVVM패턴을 이용할 떄 이 방법은 좋은 방법은 아닙니다. 이번시간에 소개할 내용은 이러한 MVVM 패턴을 이용해 RoutedEvent를 처리해야 하는 상황에서 View와 ViewModel간의 연결 없이 RoutedEvent를 Command로 연결할 수 있는 방법에 대해 소개합니다.

CommandBinding MarkupExtension

이번시간에는 MarkupExtension을 이용해 RoutedEvent와 Command를 연결할 수 있는 CommandBinding MarkupExtension을 구현합니다. 구현 완료시 아래 코드와 같이 XAML을 이용해 RoutedEvent를 쉽게 Command에 연결 할 수 있습니다.


CommandBinding MarkupExtension은 크게 2가지 부분으로 나뉩니다. 첫번째 부분은 CommandBiding MarkupExtension을 정의하는 MarkupExtension과 CommandBinding객체를 이용해 RoutedEvent와 Command를 연결시켜주는 역할을 하는 CommandBinding Attached Property부분입니다.

먼저 CommandBinding MarkupExtension은 아래와 같이 아주 단순한 구조로 Command와 RoutedEvent에 대한 정보를 저장할수 있는 형태를 갖습니다.


그리고 Attached Property에서는 입력받은 CommandBinding으로부터 Target의 RoutedEvent를 처리합니다. CommandBinding Property에서는 CommandBindingManager를 통해 CommandBinding MarkupExtension과 Target을 관리하고 Target의 ViewModel(DataContext)이 갱신되었을 때 CommandBinding에서 지정한 RoutedEvent를 Command에 연결하는 과정을 수행합니다.

이상 Reflection과 Attached Property, MarkupExtension을 이용해 CommandBinding을 구현하는 방법에 대해 소개해 드렸습니다.