본문 바로가기

.NET/WPF

데이터 바인딩 개념

데이터 바인딩의 개념
데이터 바인딩은 UI 컨트롤과, 비즈니스 객체 (ValueObject)를 어떻게 맵핑 시켜줄것인가를 정의해주는 것이다. 이 데이터 바인딩은 윈폰7에서 새롭게 등장한 것이 아니라 윈도우의 WPF나 실버라이트의 데이터바인딩과 동일한 기술이다.

딱 보고 받은 느낌은 자바의 스트럿츠나 JSF에서 컨트롤에 ValueObject를 데이터를 바인딩 시키는 구조와 동일하다. (View와 Model을 논리적으로는 분리해놓고, 데이터를 연결시키는 모델) 결국은 비슷한 개념은 거기서 거기라는 것.
재미있는 특징중의 하나가 데이터 소스가 되는 ValueObject가 .NET의 CLR 객체뿐만이 아니라 XML도 가능하단다. XML을 데이터 소스로 해서 UI Control에 데이터 바인딩이 가능하다.


용어를 정식용어로 바꿔보면 Dependency Object는 데이터 바인딩이 되는 대상 UI 컨트롤이고, Dependency Property는 바인딩 대상의 값이다. 예를 들어 버튼의 TextBox.Value Button.Value등이 Dependency Property에 해당한다. 바인딩에 데이터를 제공하는 데이터 소스가 Binding Source이다. 그리고, 그 안에 실제 값을 저장하는 것이 Property 이다.



데이터 바인딩의 방향성
데이터 바인딩의 특징 중의 하나는 방향성을 가지고 있다.

  • One Way : Binding Source에서 반영된 데이터를 UI에 반영하되 UI에서 그 내용을 바꿔도 자동으로 Binding Source에 반영 되지 않는다.
  • Two Way : Binding Source에 데이터가 변경되면 UI에 반영되고, 반대로 UI에서 데이터를 변경하면 Binding Source에 반영된다.
  • One way to source : UI에서 변경된 데이터가 Binding Source에 반영된다. 반대로 Binding Source의 데이터는 UI에 반영되지 않는다.

이벤트

이렇게 데이터 바인딩이 UI와 Binding Source간에 데이터를 교환해서 반영하는 개념이라면, 방향성에 맞게 언제 데이터가 변경되었는지를 인지해야 한다. One Way의 경우 Binding Source의 데이터가 바뀐 것을 UI가 인지해야 바뀐 데이터를 읽어와서 화면에 표시할 수 있고, 반대로 TwoWay의 경우 UI내의 바뀐 데이터를 언제 Binding Source에 반영해야 하는지 시점을 알아야 한다.
이를 처리하기 위한 것이 이벤트인데, UI  Binding Source는 UpdateSourceTrigger라는 Binding의 Property를 이용하여, 언제 Binding Source에 데이터를 업데이트 할지 정의한다. (예를 들어 Focus를 잃어 버렸을때나, TAB을 눌렀을 때 등)
Binding Source UI는 이전 예제 처럼 Collection(List 타입)의 경우 ObservableCollection과 같이 값이 변했을 때 UI에 이벤트를 전달해주는 클래스를 이용한다.

데이터 변환
그리고 Binding Source와 UI 간에 데이터를 바인딩할 때, 데이터의 포맷이나 타입이 틀릴 수 가 있는데. 예를 들어 TextBox.Value는 string형이고, ValueObject에서 float 타입을 저장하고자 할 때 형 변화가 필요하다. 또는 금액이라는 데이터가 KRW로 저장되어 있는데, 출력은 상황에 따라서 USD로 출력해야할 경우와 같은 경우가 된다.
이런 경우에는 Data Converter를 사용할 수 있다. Binding 과정에 데이터를 변환해주는 개념이다. 자세한 개념은 IValueConverter 인터페이스 (http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx) 를 참고하도록 한다.

Collection 형태의 데이터 핸들링 및 검색,그룹핑
그 밖에도, 앞 포스팅 예제에서도 설명한것과 같이 Collection (List) 형태의 데이터 바인딩도 지원하며, 이런 타입의 경우 조건에 따른 Filtering, Grouping도 가능하고, Master-Slave 형태의 데이터 모델도 바인딩이 가능하다.

본 포스트는 http://msdn.microsoft.com/en-us/library/ms752347.aspx 내용을 기반으로 작성되었습니다. 자세한 내용은 위의 링크를 참고하세요.