GSI

'DataBinding'에 해당되는 글 3건

  1. 2007.11.16 C++ DataBind (값 변경시 함수 호출)
  2. 2007.11.16 데이터 바인딩#2 - Binding Mode
  3. 2007.11.16 데이터 바인딩#1 - 기본

가끔 요즘 나오는 기술들을 보다 보면 데이터 바인딩에 대한 내용이 잘 구현되어있는거 같다. 물론 이해는 100% 되지 않지만 말이다.

그래서 C++에서 나름대로 사용하면 이런 형태는 어떨까 해서 하나 만들어 봤다. ^^
조금더 다듬어서 일부 기능은 이것을 사용해도 될거 같다.

사용되는 구조는 데이터를 가지고 있는 객체를 CContain 클래스 처름 구헌한다고
가정을 해보면 CDataBind 클래스와 연결후에 CDataBind의 객체만 SetValue 하면 된다.
이때 CContain 인스턴서의 PropertyChanged()가 자동으로호출 될 수도 있다.

이것과 다르게 함수포인터를 연동하는 부분도 추가를 해봤다. 클래스 내부의 함수가
함수 포인터로 하기에는 조금 몇가지 제약사항이 있기 때문에 전역 함수를 포인터와
연동하고 값이 바뀌게 되면 해당 함수가 호출 되는 구조를 취하게 된다.

혹.. 필요하신분 있으시면 요청시 설명해드릴게요 ^^
혹.. 좋은 의견 있음 코멘트 부탁 해요. ^^

Posted by gsi
:

데이터 바인딩#1 - 기본
▶데이터 바인딩#2 - Binding Mode
데이터바인딩#3 - DataContext
데이터 바인딩#4 - TextBox vs Run
데이터 바인딩#5 - FrameWorkElement Demo
데이터 바인딩#6 - IValueConverter


Binding 정의가 있는 컨트롤이나 엘리먼트는 항상 바인딩의 타깃이 된다. 바인딩 타깃은 DependencyObject로부터 상속되며 바인딩이 설정되는 프로퍼티는 반드시 의존 프로퍼티의 지원을 받아야 한다.
그래서 Label인 경우 DenpendencyObject 타입의 정적 publid필드인 ContentProperty가 존재 하게 된다. (내부적으로 ^^)

바인딩의 코드를 C#에서 처리한 예제를 보면 알 수 있다.

ScrollBar > scroll
Label > lbl
이라고 가정한다.

Binding bind = new Binding();
bind.Source = scroll;
bind.Path = new PropertyPath(ScrollBar.ValueProperty);
lbl.SetBinding(Label.content, bind);

여기서 바인딩 타깃은 SetBinding의 메소드를 통해서 호출되게 된다. 이 메소드는 FrameworkElement에서 정의 되었고 DependencyProperty인자를 알수 있습니다.

이제 바인딩에 사용되는 Mode에 대해서 살펴 보겠습니다.
바인딩의 Mode를 보게 되면, OneWay, TwoWay, OneTime, OneWayToSource로 나열할 수 있습니다.

기본적인 형태는 아래와 같습니다.

Content="{Binding ElementName=scroll, Path=Value, Mode=OneWay}"

여기서 Mode 프로퍼티를 설정하는 것은 Path 프로퍼티를 설정하는 것과 같이 콤마로 구분됩니다.

Content="{Binding ElementName=scroll, Path=Value, Mode=TwoWay}"

이전의 코드에서 보게 되면 OneWay, TwoWay 는 동일하지만 실제로는 Label의 Content 프로퍼티의 변화도 ScrollBar의 Value프로퍼티에 반영됩니다.

Content="{Binding ElementName=scroll, Path=Value, Mode=OneTime}"

OneTime 모드의 경우는 타깃이 소스로부터 초기화는 되지만 소스의 변화에 반응하지 않습니다. 즉, 한번만 초기화 되고 더이상 되지 않습니다.

Content="{Binding ElementName=scroll, Path=Value, Mode=OneWayToSource}"

이것은 일반적으로 소스와 타깃의 의미에 반대 되는 행동을 하게 됩니다. 다시 말해서 과녁이 화살을 향해서 간 다음에 꽂히는 것과 같습니다.
이 경우는 타깃은 소스를 갱신하게 되는데요. 이전의 코드에서는 Label은 ScrollBar에 건네줄 숫자 형태의 데이터가 없기 때문에 Label은 비어 있고 ScrollBar를 움직여도 반응이 없게 됩니다.

하지만 OneWayToSource가 유용할 때가 있습니다. 바로 두 프로퍼티를 바인딩할 때 타깃 프로퍼티가 의존 프로퍼티의 지원을 받지 못하지만 소스는 지원받는 경우라면 소스에 바인딩을 걸고 Mode를 OneWayToSource로 설정하는 것으로 해결할 수 있습니다.
아래의 소스를 보시면 알 수 있습니다.

    <StackPanel>
        <ScrollBar Orientation="Horizontal" Margin="24"
                Maximum="100" LargeChange="10" SmallChange="1"
                Value="{Binding ElementName=lbl, Path=Content}"/>
        <Label Name="lbl" Content="50" HorizontalAlignment="Center" />
    </StackPanel>

사용자 삽입 이미지

위의 코드가 되면 Label은 소스가 되고 ScrollBar는 타깃이 되게 됩니다.
Label은 50으로 Content를 설정하였고, ScrollBar는 가운데 있게 됩니다. ScrollBar를 움직이면 Label도 같이 움직이는 것을 알 수 있습니다. 이 부분은 Mode가 기본적으로 TwoWay로 설정되어 있기 때문입니다.
하지만 TwoWay를 OneWay 또는 OneTime 로 하게 되면 동작하지 않습니다.

조금 다르게 아래의 코드를 봅시다.

Value="{Binding ElementName=lbl, Path=Content, Mode=OneWayToSource}"

모드는 OneWayToSource로 하게 되면 ScrollBar가 Label 소스를 제어 하게 됩니다. Label은 ScrollBar의 Value을 사용해서 50이 0으로 초기화가 되며ScrollBar를 움직이면 Label이 움직이게 되는 것을 확인할 수 있습니다.

기본 바인딩 Mode는 바인딩이 정의되어 있는 곳의 프로퍼티에 의해 제어되게 된다. ScrollBar에서  Value 프로퍼티의 기본값이 TwoWay 바인딩 모드로 설정되어 있어야 한다.
ScrollBar의 의존 프로퍼티인 ValueProperty는 BindsTwoWayByDefault 프로퍼티가 true인 FrameworkPropertyMetadata가 필요하게 되는 것이다. (이것은 속에 있나 봅니다. ^^)

Mode 프로퍼티는 바인딩의 가장 중요한 컴포넌트 중의 하나입니다. 알맞는 Mode를 설정하는 것이 중요합니다. ^^

참고 ^^
본 내용은 "찰스페졸드의 WPF"의 내용을 이해 하고 나름 생각과 같이 정리한 겁니다.
제제가 가해질 경우 바로 삭제하도록 하겠습니다. ^^;
Posted by gsi
:

데이터 바인딩#1 - 기본

WPF 2007. 11. 16. 10:04 |

▶데이터 바인딩#1 - 기본
데이터 바인딩#2 - Binding Mode
데이터바인딩#3 - DataContext
데이터 바인딩#4 - TextBox vs Run
데이터 바인딩#5 - FrameWorkElement Demo
데이터 바인딩#6 - IValueConverter

이번 내용은 기본 바인딩에 대해서 설명 합니다.
ScrollBar와 Label 연동 부분으로 설명합니다.

데이터 바인딩은 컨트롤과 엘리먼트의 데이터 연결하는 것을 말한다.
데이터 바인딩은 CheckBox 컨트롤을 불리언 변수에 연결하는 것과 같은 간단한 방법 부터 데이터 베이스와 데이터 엔터리 패널을 연결하는 것처름 복잡해질 수 있다.

데이터 바인딩은 소스(Source)와 타깃(target)가 필요하다.
일반적으로 소스는 데이터, 타깃은 컨트롤을 의미 한다. 하지만 컨트롤의 값을 데이터로 전달할 경우는 소스가 타깃이 되는 경우가 있다.

가장간단하게 데이터 바인딩을 생각해 보면 ScrollBar의 Value 프로퍼티를 보여주기 위한 Label 컨트롤을 생각해 볼 수 있다.

// 바인딩 소스
<ScrollBar Name="scroll" Orientation="Horizontal" Margin="20" Maximum="100" LargetChange="10" SmallChange="1" />
// 바인딩 타깃
<Label HorizontalAlignment="Center" Content="{Binding ElementName=scroll, Path=Value}"/>

바인딩 자체는 언제나 타깃 내에서 생성된다.
Content="{Binding ElementName=scroll, Path=Value}"

중괄호 내에 Binding가 정의 되어 있고, Binding 클래스의 프로퍼티중 ElementName, Path가 정의에 포함되게 된다. 즉, ElementName에 ScrollBar의 Name가 포함되고 Path에 ScrollBar의 Value가 포함되게 된다.
여기서 보게 되면 기존의 xaml 코드와 다르게 Binding의 코드는 내부에 "" 이것으로 묶지를 않았다. 솔직히 이 부분은 나도 아직도 애메하다. ^^
위의 코드를 조금더 풀어 쓰게 되면 아래와 같이 된다.

<Label HorizontalAlignment="Center">
   <Label.Content>
      <Binding ElementName="scroll" Path="Value" />
   </Label.Content>
</Label>

위의 코드 보다는 조금더 보기는 편한거 같다. 인텔리센서도 먹으니 편한듯 보이고 두개의 연관성을 고려해서 코드 짜는 법을 익혀야 할거 같다.

위의 코드로 구성되는 프로그램은 아래와 같습니다.
사용자 삽입 이미지

다음 내용은 Binding에 대해서 조금더 상세한 내용을 정리 하겠습니다.

참고 ^^
본 내용은 "찰스페졸드의 WPF"의 내용을 이해 하고 나름 생각과 같이 정리한 겁니다.
제제가 가해질 경우 바로 삭제하도록 하겠습니다. ^^;
Posted by gsi
: