xaml에서 DataBinding을 사용하면, 화면에 표시될 값을 어디선가 가져와야한다. 그 값을 제공해 주는 개체가 필요하고, 그 개체를 DataContext를 이용해 지정해준다고 보면 된다. DataContext의 대상은 ElementName을 통해 xaml에 있는 다른 control을 통해 Binding할수도 있으나, User가 정의한 Class로 Binding하는것도 가능하다.(근데 사실 이 목적이 제일 강하다. WPF에서는 View에 해당하는 xaml에서는 화면에 값을 표시해주는 역할, 사용자의 입력을 Backend( Controller or ViewModel)에 전달해주기만 하면 된다. View는 로직에 관여하지 말고, Controller는 화면에 관여하지 않아야 좋다고 생각.
그리고 DataContext는 상속된다. 예를 들어, MyObjVM클래스 안에 Header라는 속성이 있고, 이 클래스의 객체 (이름은 myObj)를 DataContext로하여 연결하면, 그 태그 하위에서는 Path로 접근이 가능하다.
//xaml
<UserControl DataContext={Binding Source={StaticResource myObj}}>
<Textblock Text={Binding Path=Header} />
</UserControl>
//Model
public class MyObjVM{
private string header;
public string Header{
get{ return this.header; }
set{ this.header = value; this.RaisePropertyChanged("Header"); }
}
}
위와 같이 사용하면 된다.
그리고 Binding 안에 BindingMode가 있는데, default로 2way이다. (정확히는 TwoWayByDefault)
xaml에서 지정가능한 형태는 OneWay, TwoWay, OnewayToSource가 있다. 소스가 누구고 타겟이 누구인지는 MS홈페이지에 나와있다.
Xaml쪽이 target이고, source는 ViewModel쪽. Twoway는 target <-> source이고,
Oneway는 Noti가 가는 방향이 Source -> Target이다. 즉, Readonly인 속성에 대해서는 OneWay로 지정해도 된다. 하지만 Textbox등 Twoway가 되어야하는 곳을 OneWay로 묶으면, exception이 발생한다. OnewayToSource는 xaml쪽에서 속성의 값을 바꾸는것이 가능하다. 솔직히 BindingMode는 잘 사용한 기억은 없다.
댓글