DataBinding lifeisforu@naver.com 최도경
이문서는 MSDN 의내용에대한요약을중심으로작성되었습니다. Data Binding Overview. Markup Extensions and WPF XAML.
What Is Data Binding UI 와 business logic 사이의연결을설정하는 process 이다. Binding 이올바르게설정되면 data 는적절한통지를제공한다.
DataBindingLab sample 첨부한 DataBindingLab.zip 을 download 하여 DataBindingLab.cspro j 를열어라. 이 UI 는 auction item 의 list 를보여준다. 이문서는이 sample 을기반으로하고있다.
Basic Concepts 어떠한요소를 binding 하고있는지와 data source 의속성이어떤지를무시하면, binding 은아래그림과같은 model 을따른다.
Basic Concepts( cont ) Data binding 은기본적으로 binding target 과 binding souce 간의가교역할을한다. 보통각 binding 은 4 개의요소로구성된다 : binding target, target property, binding source, binding source 에서의 path. Target property 는 dependency property 여야만한다. Binding source 는 custom CLR object 여야한다는제약을가지고있지는않다. WPF data binding 은 CLR object 와 XML 형식의 data 를지원한다.
Data Flow 이전그림에서 binding 의 data 흐름이어떻게될것인가를결정할수있다. Binding object 의 Mode property 를설정함으로써이를제어한다.
Data Flow( cont ) Mode 는다음과같은값을가질수있다. OneWay : Source property 가 target property 를자동으로갱신한다. 그러나반대는허용하지않는다. 대부분이 OneWay binding 이다. TwoWay : Source property 가 target property 를자동으로갱신하고, 반대도자동으로수행된다. OneWayToSource : 이는 OneWay 의반대이다. Target property 가 source property 를자동으로갱신한다.
Data Flow( cont ) ( OneWay 와 TwoWay 에대해 )Source 의변경을검출하기위해서는, source 가 INotifyProeprtyChanged 와같은적절한 property 변경통지메커니즘을구핸해야한다. How to : Implement Property Change Notification.
Source Update TwoWay 나 OneWayToSource 는 target property 의변경을듣고, 이를 source 에전달한다. UpdateSourceTrigger property 를통해그시점을조정한다.
Source Update( cont ) UpdateSourceTrigger 는다음과같은값을가질수있다. PropertyChanged : target property 가변경되자마자 source 를갱신한다. LostFocus : target property 가 focus 를잃었을때새로운값으로 source 를갱신한다. Explicit : 사용자가명시적으로 UpdateSource() 라는 method 를호출할때 source 를갱신한다.
Source Update( cont ) UpdateSourceTrigger 의예. UpdateSourceTrigger value When the Source Value Get s Updated LostFocus (default fortext Box.Text) When the TextBox control loses focus Example Scenario for TextB ox A TextBox that is associate d with validation logic (see Data Validation section) PropertyChanged Explicit As you type into thetextbo x When the application calls UpdateSource TextBox controls in a chat room window TextBox controls in an edit able form (updates the sou rce values only when the u ser clicks the submit butto n)
XAML Specific Markup Extension Binding 은 markup 확장이다. 이때문에 markup 확장이무엇인지알필요가있다. 필요성 : Attribute 의 value 는문자열만을받기때문에기능을보완할필요가있다. 그래서 curly brace( {} ) 를사용해이를확장한다.
XAML Specific Markup Extension( cont ) XAML 지정 markup 확장은 x: 라는 prefix 를사용한다. x:type 은 named type 을위한 Type object 를제공한다. 이는 style 이나 template 에서주로사용된다. x:type Markup Extension 을참조하라. x:static 은 static value 를생산한다. Target property 의 value 의 type 으로직접지정되지않지만그 type 에대해평가될수있는 valuetype code entity 로부터오는값이다. x:static Markup Extension 을참조하라.
XAML Specific Markup Extension( cont ) x:null 은 property 의값으로 null 을지정한다. 이는 attribute 나 property element value 로도사용될수있다. x:null Markup Extension 을참조하라. x:array 는 XAML 구문에서일반적인 array 를생성할수있도록지원한다. x:array Markup Extension 을참조하라.
WPF Specific Markup Extension WPF 는다음과같은 markup 확장을제공한다. StaticResoruce 는이미정의된 resource 의값을 property 에제공한다. 이는 XAML load time 에평가된다. StaticResource Markup Extension 을참조하라. DynamicResource 는 runtime 에 resource 에대한참조를설정하도록지연된값을 property 의 value 에제공한다. DynamicResource Markup Extension 을참조하라.
WPF Specific Markup Extension( cont ) Binding 은 property 에값을 bounding 하는 data 를제공한다. 이는 runtime 에수행된다. 이 markup 확장은좀복잡하다. 왜냐하면 data binding 을위한 inline 구문들을가능하게했기때문이다. Binding Markup Extension 을참조하라. RelativeSource 는 Binding 을위한정보를제공한다. Runtime object tree 에서의관계를찾아갈수있도록해준다. RelativeSource Markup Extension 을참조하라.
WPF Specific Markup Extension( cont ) TemplateBinding 은 control template 이 class 의 object-model-defined property 로부터가져오는 templated property 를위한값을사용할수있도록해준다. TemplateBinding Markup Extension 과 Styling with ControlTemplate Sample 을참조하라. 그외에도몇개의 extension 들이있다 : ColorConvertedBitmap, ComponentResourceKey, ThemeDictionary 등.
Creating a Binding Bindnig 을만들기위해서는 Binding object 를사용해야한다. XAML 의 markup 확장을사용할수도있다.
Create a Binding : Specifying the Binding Source 예제에서 DataContext 의 binding source 로 mydatasource 라는 key 를가진 static resource 를 binding 했다. DataContext 는자식 object element 에전파된다. 그러므로 Path 로 ColorName 을지정한다는것은 MyData.ColorName 을사용한다는의미이다.
Creating a Binding : Specifying the Binding Source( cont ) 그렇지않으면다음과같이직접 Source 를지정해주어야만한다. 여러가지방법으로 source 를지정할수있는데, 이는 HowTo : Speicfy the Binding Source 를참조하라.
Creating a Binding : Specifying the Path to Value Source 에는 object 가지정되기때문에, 구체적인 property 를지정하고싶다면 Path 를지정해야한다. XML data 를지정할때는 XPath 를지정할수있다. 구체적인구문은 Path 와 XPath 를참조하라. {Binding} 이라고만쓰면 parent 로부터상속된 DataContext 를사용하겠다는의미이다.
Data Conversion Binding target 과 binding source 의 type 이일치하지않을때 converter 를사용해값이호환되도록만들수있다. CreateBinding section 에서 "Red" 를지정했는데, Background 에값이제대로할당된다. 이는 Brush type 인데 String type 을넣어도동작하는이유는 converter 가지정되어있기때문이다. 예제같은경우에는 default converter 를사용하고있다.
Binding to Collections 보통 collection 을 data 로받는 control 들은 ItemsControl 을상속하고있다. 예를들면 ListBox, ListView, TreeView 등이있다. ItemsCollection 은 ItemsSource property 를가진다.
Binding to Collections 일반 property 들의경우에는 INotifyPropertyChanged 를구현해서 source update 를수행했으나, collection 을위한 property 같은경우에는 INotifyCollectionChanged 를구현하게된다. INotifyCollectionChanged 를구현해놓은것이 ObservableCollection< T > 이다.
Data Conversion( cont ) 만약 default converter 가없다면 custom converter 를만들어야한다. Converter 는 IValueConverter interface 를구현한다.
Example : DateConverter String 과 DateTime 의값을 converting 하기위한 converter.
Example : DateConverter( cont ) XAML 에서다음과같이 converter 를 static resource 로만든다. 그다음 data 를 binding 할때 Converter 를지정한다.
Data Validation 입력한 data 가옳은지판단해야하는경우가있다. 이때 validation rule 을지정할수있다. ValidationRules 를참조하라.
Data Validation( cont ) Validation rule 을지정하려면 ValidationRule class 를상속해 Validate() method 를구현한다.
Data Validation( cont ) 물론만약 bindnig source 가 dependency property 라면 CoerceValue callback 을사용해도된다.
Excercise 회의실예약을위한 program 을구현하라. List 에서 item 을선택해서삭제를할수있어야한다. 회의시간이겹치면 message box 를출력하며제출에실패해야한다.