ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 바인딩 (2)
    .NetFramWork/WPF 2022. 6. 27. 19:43

    WPF 의 바인딩 시스템을 사용하면 지금까지 우리가 수동으로 진행했던 UI 와 데이터 객체의 통신(동기화)를 자동으로 구축할 수 있다.

     

    바인딩 시스템의 핵심 기능은 두 가지로

    UI 의 변경을 데이터 객체로 데이터 객체의 변경을 UI 자동 통신하는 동기화 기능

    서로 다른 형식의 동기화를 위한 적절한 형식 변환 기능이다.

     

    바인딩 시스템은 UI 의 의존속성과 데이터 객체의 속성이 연결되는 형태로 동작한다.

     

     


    바인딩을 이용하여 이름과 전화번호 TextBox 컨트롤 UI 에 Person 객체를 출력

     

    결과

     

     

    <TextBox Text="{Binding Path=Name}"/> 

     XAML 에서는 이것이 바인딩 코드의 전부다.

     

    이제 UI 의 의존 속성 Text 와 바인딩 할(연결할) 데이터 객체(데이터 원본이라한다)를 설정하는 것 뿐이다.

    이것은 C# 코드에서 panel.DataContext = per; 이와 같이 설정했다.

    이후에 보면 알겠지만 이 데이터 원본 또한 XAML 에서 설정 가능하다.

     

     

    UI 의 Text 의존속성과 데이터 원본 객체의 Name 속성바인딩 한다.

     

    데이터 원본 객체의 속성은 의존 속성이나 일반 .Net 속성 등 모두 가능 하지만 UI 의 바인딩 속성은 꼭 의존 속성만 가능하다 바인딩 시스템이 의존 속성을 사용하여 동작하기 때문이다.

     

    또 바인딩 원본은 구체적으로 기록되지 않으며 이것으로 UI 의 Text 의존 속성은 얼마든지 데이터 원본을 변경할 수 있는 유연성을 갖게 된다.


     

    또 바인딩 데이터 원본은 UI 요소에 설정할 수 있지만 바인딩 UI 요소에 데이터 원본이 없다면,

    부모 요소를 탐색하며 바인딩 데이터 원본을 찾게 된다.

     

    이런 설계를 더 많이 사용하는데 이와 같이 구성하면 부모 요소 하나를 사용하는 모든 자식 요소들이 설정된 데이터 원본을 공유 하여 각각의 자식 요소 변경을 갱신할 필요 없이 자동으로 자식 요소들의 변경을 갱신할 수 있도록 한다.

     

    여기에 사용되는 속성이 DataContext 속성이며 부모 요소의 트리를 검색하며 데이터 원본을 찾는다.

     

    위 예제는 StackPanel(panel)의 DataContext 가 C# 코드에서 panel.DataContext = per;

    이처럼 설정되어 데이터 원본으로 사용되며,

    자식 요소인 이름 TextBox 컨트롤과 전화번호 TextBox 컨트롤이 같은 데이터 원본인 per 객체가 된다.


    다음 예제는 부모 요소 StackPanel 의 DataContext 속성의 데이터 원본을 공유하는 TextBox 컨트롤과 Label 컨트롤 UI 의 바인딩 예제다.

    단지 다음 코드를 추가한 것 외에는 다른 곳이 없다.

     

     

    부모 요소 트리를 검색하여 데이터 원본을 설정하므로 Label 의 데이터 원본은 StackPanel 객체에 설정된 per 객체

     

    만약 이름이나 전화번호의 TextBox 컨트롤을 수정하여 다른 곳으로 포커스를 이동하면,

    데이터 원본이 변경되는 것을 확인할 수 있다.

     

    기본적으로 바인딩 엔진에서 데이터 원본과 UI 속성의 동기화를 수행하며 기본 동작은 포커스가 다른 곳으로 변경될 때 동기화 되도록 설정되어 있기 때문이다. 

     

    UI 가 변경되면 데이터 원본이 변경되도록 동기화된다는 것을 확인했으니

    다음에는 반대로 데이터 원본이 변경되면 UI 가 변경되는지 바인딩을 통해 알아 보도록 하자.

     

    '.NetFramWork > WPF' 카테고리의 다른 글

    데이터 바인딩 (4)  (0) 2022.06.28
    데이터 바인딩 (3)  (0) 2022.06.27
    데이터 바인딩(1)  (0) 2022.06.27
    버블링 과 터널링 (라우트된 이벤트)  (0) 2022.06.24
    레이아웃 <Grid>  (0) 2022.06.23

    댓글

Designed by Tistory.