(WPF강의)WPF 데이터바인딩 이란? WPF DataBinding
n 데이터 바인딩이란 컨트롤과 엘리먼트를 데이터에 연결시키는 기술이다. 데이터 바인딩은 CheckBox 컨트롤을 Boolean 변수에 연결하는 것처럼 간단할 수도 있고 복잡할 수도 있다.
n 컨트롤은 데이터를 사용자에게 보여주는 것과 사용자가 데이터를 변경할 수 있게 해주는 두 가지 기능을 제공한다. 최근 컨트롤과 데이터 사이의 많은 반복 작업들이 단순화 되면서 CheckBox를 Boolean 변수로 초기화하고 사용자가 작업이 끝난 후 Boolean 변수를 다시 CheckBox 값으로 초기화하는 코드들을 만들어야 했는데 CheckBox와 변수 사이의 바인딩을 이용하게 간단하게 처리할 수 있다.
n 데이터 바인딩은 소스와 타겟이 필요하다. 일반적으로 소스는 데이터이고 타겟은 컨트롤이다. 하지만 어느 경우엔 소스와 타겟의 구분이 모호할 때도 있다. 어떤 경우에는 반대로 타겟이 소스에게 데이터를 전달하기도 한다.
n 모든 바인딩에는 소스 객체, 소스 속성, 대상 객체 및 대상 속성이 있다.
n Target 객체는 바인딩 할 속성, 즉 데이터를 렌더링하는 UI 컨트롤을 소유하는 객체입니다. Target 속성은 태그 확장을 통해 설정된 속성이고 source 속성은 바인딩 경로이며 소스 객체는 DataContext 속성으로 지정하면 된다.
n DataContext 값은 한 컨트롤에서 다른 컨트롤로 비주얼 트리 아래로 상속된다.
n Binding.Source 속성을 통해 지정되는 원본 개체없이 정의 된 바인딩은 대상 개체의 DataContext를 원본으로 사용한다. 위의 그림에서 TextBox는 MainPage에서 상속받은 DataContext를 소스 객체로 사용한다.
n 데이터 바인딩은 이벤트 핸들러를 대체할 수 있는데 이는 C#코드를 줄이는 역할을 한다. XAML에서 정의된 데이터 바인딩은 C# 코드 비하인드 파일에서 이벤트 핸들러를 정의할 필요가 없으며 코드 비하인드 파일 자체가 필요없는 경우도 있다.
n 바인딩문의 긴형식 : 바인딩 마크 업 확장을 사용하는 대신 XAML에서 바인딩 인스턴스를 만들 수 있다 (예 : Forename에 대한 간단한 바인딩).
아래처럼 표기할 수도 있다.
n 바인딩을 더 간단하게 만들고 싶다면 Path를 생략하고 다음과 같이 바인딩을 간단히 표현할 수 있다.
n 소스 (예 : DataContext)의 속성에 바인딩하지 않고 소스 자체에 바인딩 하려는 경우는 “점(Dot)”을 사용하면 된다.
n 또는 아래와 같이 Binding 구문만 사용할 수 도 있다.
6.2 데이터 바인딩(Data Binding) 실습(OneWay, TwoWay, OneWayToSource, OneTime)
n 가장 간단한 바인딩은 두 개의 컨트롤 사이에서 존재하는데 스크롤바의 Value 프로퍼티를 보여주기 위한 Label 컨트롤을 생각하면 스크롤바의 ValueChanged 이벤트 핸들러를 이용하거나 다음 Stand Alone XAML 파일과 같이 데이터 바인딩을 정의할 수 있다.
n MainWindow.xaml
바인딩 키워드는 언제나 타겟에 설정한다. Label 컨트롤의 Content 프로퍼티에 다음과 같이 설정되었다.
Binding 키워드는 마크업 확장으로 중괄호안에 Binding 키워드가 있다. Binding의 프로퍼티 중 ElementName에는 ScrollBar의 Name 속성에 정의된 이름이 사용되었고 Path 프로퍼티에는 ScrollBar의 Value 프로퍼티가 설정되었다.
n 위 XAML에서 바인딩 정의 내에 따옴표를 사용하고 싶다면 아래과 같이 프로퍼티 엘리먼트를 사용하면 된다.
n 바인딩 정의가 있는 컨트롤은 항상 타겟이다. 바인딩 타겟은 DependencyObject로부터 상속되며 바인딩이 설정되는 프로퍼티는 반드시 의존 프로퍼티의 지원을 받아야 한다. 따라서 이 경우에 Label은 DependencyProperty 타입의 public static 필드인 ContentProperty가 필요하다. (당연히 존재한다. 바인딩 소스는 반드시 의존 프로퍼티 일 필요는 없다.)
n 프로퍼티는 프로퍼티가 변경 될 때 알려주는 이벤트와 연결되어 있는 것이 이상적이다. 하지만 몇몇 바인딩은 통지 이벤트 없이도 동작한다.
n 바인딩을 C#코드로 구현한 예문을 보면 명확히 알수 있는데 아래 코드를 보자.
n MainWindow.xaml
n MainWindow.xaml.cs
n 소스와 타겟의 의미는 소스 엘리먼트에서의 변화를 타겟 엘리먼트에 반영되도록 하는 의미를 담고 있다. 사실 이것은 바인딩으로 가능한 4가지 모드 중 하나일 뿐이다. 바인딩 모드는 Mode 프로퍼티에 BindingMode 열거형 멤버로 설정할 수 있다.
n 이번에는 Label과 ScrollBar의 역할을 바꾸어 테스트 해보자.
n 프로젝트 : BindingScrollBarToLabel
n MainWindow.xaml
Label이 소스가 되고 ScrollBar가 타겟이 되었는데 Label의 Content를 “50”으로 설정했으므로 최초 ScrollBar의 Value 프로퍼티에 반영이 되어 스크롤바가 가운데에 위치한다. 스크롤바를 움직이면 라벨이 갱신되는 TwoWay 바인딩이 기본적으로 설정되어 있다. 만약 여기에서 Mode를 OneWay로 설정하면 스크롤바를 움직여도 라벨의 Content 프로퍼티는 갱신되지 않을 것이다. 테스트 해보자.
Mode를 OneWayToSource로 하면 동작한다. 이것은 소스와 타겟을 바꾸어서 동작하기에 그렇다. 라벨은 초기값이 50, 스크롤바는 초기값이 0이므로 스크롤바의 초기값 0이 라벨에 할당되고 이 후 스크롤바를 움직이면 라벨이 갱신된다.
n 다음 예제는 클라이언트 영역의 너비와 높이를 표시하기 위해 데이터 바인딩을 사용한 예제이다.
]>n 프로젝트명 : WidthHeightDisplay
n MainWindow.xaml
2개의 TextBlock은 Grid의 ActualWitdh, ActualHeight 프로퍼티와 바인딩 되었는데 이 두 속성은 읽기전용이므로 OneWay로 바인딩 된다.
n TextBlock의 Text 프로퍼티는 TextProperty라는 의존 프로퍼티에 의해 지원되는데 “바인딩에서 타겟은 반드시 의존 프로퍼티가 되어야 된다. 바인딩 소스 속성은 반드시 의존 프로퍼티일 필요는 없다.(바인딩 소스 객체가 INotifyPropertyChanged 인터페이스를 구현하면 일반 속성도 가능하므로)”는 사실을 명심하자. C#코드를 통해 바인딩 시켜보면 명확해지는데 SetBinding의 첫 번째 인자는 DependencyProperty 타입이 되어야 한다.
댓글 없음:
댓글 쓰기