블로그 이미지
내게 능력 주시는 자 안에서 내가 모든것을 할수 있느니라 - 빌립보서 4 : 13 - happydong

카테고리

Happydong (1363)
프로그래밍 (156)
MUSIC (16)
인물 (3)
Utility (10)
세미나 소식&내용 (22)
IT뉴스 (18)
운동 (830)
CAFE (10)
Life (282)
Total
Today
Yesterday

'의존속성'에 해당되는 글 1건

  1. 2008.12.18 [ Silverlight 2 ] Dependency Property 이해



  Dependency Property (의존 속성)

실버라이트 2에서는 기존의 CLR(공용 언어 런타임)속성의 확장인 Dependency Property(의존 속성)를 이용해서 매번 자동적으로 속성의 값이 변경시킬수 있도록 지원해 줍니다.즉, 부모의 값이 변경이 되면 자식의 값이 같이 변경될수 있도록 할수 있는 것이라고 할수 있겠군요. 이런 방법을 이용해 Silverlight Application를 구현하면 바인딩모델로 만들어 쉽게 값을 설정하고 변경할 수 있으며, 개발자 입장에서는 유지보수가 편리할수 있습니다.
 Dependency Property는 기존의 CLR속성으로 노출되며, 내부적으로는 DependencyProperty구현 되어 있어 외부에서는 모를수 있습니다. 그러나 실버라이트 컨트롤들은 거의 대부분이 DependencyProperty로 구현되어 있어 리소스 및 스타일이라든지, 애니메이션, 기타값을 설정하는 부분에 바인딩으로 처리될 수 있습니다.

 Dependency Property의 주요 특징

 . 매번 자동적으로 속성의 값을 바꾼다. (다른 외부적인 값에 의존해서 값이 결정됨)
 . 기존의 CLR의 확장

 Dependency Property를 이용한 CustomComtrol

 간단하게 Dependency Property를 이용한 커스텀컨트롤을 만들어 보았습니다. UserNameCustomComtrol인데요, 사용자의 이름을 입력 받는 커스텀컨트롤이 될 것 입니다. 그럼 하나하나 코드를 보면서 알아보도록 하겠습니다.

Property 선언

public class UserNameCustomControl : Control

{

public String UserName

{

get { return (String)GetValue(UserNameProperty); }

set { SetValue(UserNameProperty, value); }

}

...나머지 코드는 아래에서

}


DependencyProperty의 값을 설정하거나 반환하기위해서는 DependencyObjectSetValue메소드와 GetValue메소드를 이용하여 값을 설정해 주거나 반환해 주어야 합니다. 그렇다면 DependencyObject는 어디에서 받아올지 궁금해 할수가 있겠군요.  실버라이트에서 거의 모든 컨트롤들이 UIElement를 상속받는데, UIElement를 DependencyObject를 상속 받아 구현된 클래스입니다. 즉, 제가 예제로 만든 UserNameCustomControl는 Control을 상속받아 구현됐는데요, Control클래스는 FrameworkElement 클래스를 상속을 받고, FrameworkElement 클래스는 UIElement 클래스를 상속을 받지요. (아래 그림 참고)

사용자 삽입 이미지


UserNameProperty는 DependencyProperty에서 선언된 필드명 입니다. 그럼 DenpendencyProperty 함수 선언은 어떻게 하는지 알아 보도록 하지요. 코드는 아래와 같습니다.

DenpendencyProperty 함수 선언

public static readonly DependencyProperty UserNameProperty =

DependencyProperty.Register(

"UserName",

typeof(String),

typeof(UserNameCustomControl),

new PropertyMetadata(new PropertyChangedCallback(UserNameCustomControl.OnUserNamePropertyChanged)));


 첫번째 라인에 보면 Static으로 선언하고, 정적일 것이기에 readonly로 지정하여 DependencyProperty를 생성한는 것을 보실수 있을겁니다.
 두번째 라인부터는 DependencyProperty 클래스의 Static메소드인 Register메소드를 호출하여 Silverlight속성 시스템에 등록 하는 코드입니다. Register함수는 4개의 파라미터를 선언해 주어야하는데요, 아래 표를 참고 하셔서 보시면 될 것 같습니다.

속성

설명

Name

등록할 속성의 이름

PropertyType

속성의 타입

ownerType

속성을 포함한 부모의 타입

typeMetadata

속성 메타데이터 지정

(보통 콜백(Callback) 함수를 지정함)


마지막에 typeMetadata는 지정하지 않을수도 있습니다. 즉, null로 지정이 가능합니다.그리고 필요에 따라 CallBack함수를 만들어서 사용할 수도 있습니다. 그럼 다음은 CallBeck함수를 어떻게 지정하는지 알아 보도록 하겠습니다.

CallBeck 함수

private static void OnUserNamePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

{

UserNameCustomControl userNamecontrol = d as UserNameCustomControl;

string newUserName = (string)e.NewValue;

string oldUserName = (string)e.OldValue;

}


위 코드를 보시면 OnUserNamePropertyChanged함수에는 2개의 파라미터(Parameter)를 받을수 있음을 확인 하실수 있을 것 입니다. 그리고 다음 코드를 보면 DependencyObject를  UserNameCustomControl로 캐스팅하는 코드인데요, 이렇게 캐스팅한 컨트롤을 이용하여 값이 변경되었을때 필요한 일들을 정의하면 되겠습니다. 그리고 DependencyPropertyChangedEventArgs함수에서는 NewValue함수와 OldValue함수가 있어서 현재 변경된값과 변경되지 전의 값을 확인 할수도 있습니다. 이렇게 해서 UserNameCustomControl이 어느정도 완성이 되었습니다. 이제 원하는데로OnUserNamePropertyChanged에서 값을 변경해 주거나 설정해 주면 되겠습니다.

아래 코드는 위의 코드들을 하나로 나타낸 코드입니다.(참고)

전체 코드 보기

public class UserNameCustomControl : Control

{

public String UserName

{

get { return (String)GetValue(UserNameProperty); }

set { SetValue(UserNameProperty, value); }

}

 

// Using a DependencyProperty as the backing store for UserName.  This enables animation, styling, binding, etc...

public static readonly DependencyProperty UserNameProperty =

DependencyProperty.Register(

"UserName",

typeof(String),

typeof(UserNameCustomControl),

new PropertyMetadata(new PropertyChangedCallback(UserNameCustomControl.OnUserNamePropertyChanged)));

 

private static void OnUserNamePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

{

UserNameCustomControl userNamecontrol = d as UserNameCustomControl;

string newUserName = (string)e.NewValue;

string oldUserName = (string)e.OldValue;

}

}



처음으로 실버라이트를 접하는 사람들에게는 정말 이해하기 힘든 부분일수 있습니다.(저 역시 그랬으니까요) 그러나 실버라이트를 제대로 공부 하려면 정말 꼭꼭 알아야하는 내용입니다. 이렇게 알고 DependencyProperty를 잘 이용하면 바인딩모델로 구현하는데 쉽고, 편하게 구현할 수 있을 것 입니다.
Posted by happydong
, |