본문 바로가기

silverlight

Data Binding

데이터 바인팅은 User Interface(UI)와 Data Source를 연결할 수 있는 방법입니다.


런타임에서 Binding
UI에 Data source를 연결하기 위해서는 Binding 클래스의 인스턴스를 생성해야 합니다.
Binding 클래스의 인스턴스를 생성하고, Data source, Binding Mode를 설정 한 뒤, UIElement에 (정확히는 FrameworkElement) SetBinding 함수를 사용하여 연결 될 Property와 Binding 인스턴스를 넘겨줍니다.
이때, FrameworkElement 내 연결 될 Property는 반드시 DependancyProperty여야 합니다.

<TextBox x:Name="myTextBox"/>
DateTime.Now; 

Binding bind = new Binding("Now");
bind.Source = now;
bind.Mode = BindingMode.OneWay;

this.myTextBox.SetBinding(TextBox.TextProperty, bind);


디자인타임(XAML)에서 Binding
XAML에서는 FrameworkElement 내 Data source가 연결 될 DependancyProperty에 중괄호({})를 사용하는 구문을 사용해서 Binding을 할 수 있습니다. 중괄호 안에 Binding 키워드를 사용하여 DependancyProperty의 Value가 외부의 Data source에서 바인딩 된다고 알려줍니다. 이 때, Binding 의 다른 Property는 PropertyName=Value 형식의 구문으로 추가를 해 줍니다.
<TextBox x:Name="myTextBox" Text="{Binding Now, Mode=OneWay}"/>
DateTime now = DateTime.Now;
this.myTextBox.DataContext = now;
return;

Binding Mode 선택
Binding 인스턴스를 생성하고, 인스턴스의 Mode속성을 선택하면 OneTime, OneWay,TwoWay 3가지 열거형 타입 중 선택 할 수 있습니다. Mode는 Data source와 FrameworkElement 사이의 데이터 흐름을 설정하는 옵션입니다.

OneTime
OneTime 모드는 Binding 하면서, 대상 FrameworkElement에 단 한 번만 값을 입력하게 됩니다. 그렇게 때문에, Data source의 값이 변경 되도 FrameworkElement에는 아무런 변화가 없게 됩니다.
OneWay
OneWay는 Binding에서 Default 로 지정되는 모드입니다. OneWay모드는 Data source의 값 변경을 기다리고 있다가 Data source 값이 변경 되면, FrameworkElement에 변경 된 Data source 값을 재 입력하게 됩니다.
TwoWay
TwoWay모드는 Data source와 FrameworkElement의 DependancyProperty가 서로 Binding이 되어 어느 쪽에서라도 값이 변경 되면 다른 속성에도 변경 된 값을 입력하게 됩니다. 예를 들어, Data Source의 값이 변경 되면 FrameworkElement의 DependancyProperty 값이 변경되고, 반대로 FrameworkElement의 DependancyProperty 값이 변경 되면 Data source의 값도 변경 됩니다. 어떻게 보면 재귀적으로 각각의 속성들이 서로 영향을 받아서 무한루틴이 될 것 같지만 두 속성의 값이 같으면 더 이상 영향을 받지 않기 때문에 무한루틴에 빠지게 되는 일은 없습니다.