2010. 4. 16. 19:23
의존속성은 일반적인 프로퍼티와 같은 방식으로 사용되도록 설계되었기 때문에 눈치 채지 못했을 수도 있다.
의존속성은 일반적인 프로퍼티가 아니다. 전통적인 .NET 유형으로 정의된 일반적인 프로퍼티에 WPF기능이 추가된 것이라고 생각하자. (일반적인 프로퍼티 + WPF 기능)


                          이렇게 구성됨으로써 WPF는 .NET 세계의 안정성을 붕괴시키지 않고서도
                          프로퍼티 같은 기본적인 구성 요소를 변경 할 수 있게 된다.

순서

1. 의존속성 정의
2. 의존속성 등록



1.의존속성 정의

FrameworkElement 클래스는 Margin 프로퍼티를 정의하는데, 이 프로퍼티는 모든 요소들이 공유한다. Margin 프로퍼티는 의존속성이다. 즉, Margin 프로퍼티는 FrameworkElement 클래스에 다음과 같이 정의되어 있다.

public calss FrameworkElement : UIElement, ...
{
     public static readonly DependencyProperty MarginProperty;  //의존속성 정의
     ...
}

- 의존속성을 정의하는 필드는 일반적인 프로퍼티 이름에 위와 같이 Property라는 단어를 추가하는 형태를 갖는다.
- 의존속성 필드는 readonly 필드로 정의된다. 이는 의존 속성 필드는 오직 FrameworkElement 클래스의 static 생성자에서만 설정될 수 있다는 것을 의미한다.

2.의존속성 등록

-
DependencyProperty 클래스에는 public 생성자가 없기 때문에 DependencyProperty 클래스의 인스턴스가 직접적으로 생성될 수 없다. (static dencyProperty.Register()메서드만을 사용해서 생성)

- DependencyProperty멤버들이 읽기 전용 이기 때문에 개체가 생성된 이후에 값을 변경 할 수 없기 때문에 DependencyProperty 멤버의 값은 반드시 Register()메서드의 인자로 제공되어야 한다.


예제)
DependencyProperty 개체를 생성하는 방법을 보여준다. FrameworkElement 클래스는 static 생성자를 사용하여 MarginProperty 필드를 초기화한다.


static FreamworkElement()
{
     FreamworkPropertyMetadata metadata = new FrameworkPropertymetadata(
     new Thickness(), FreameworkPropertyMetadataOptions.AffectsMeasure);

     FrameworkPropertyMetadata 개체를 생성하는 단계이다. 이 개체는 의존속성에서 사용하고 싶은 서비스를 나타낸다. 데이터바인딩이나 애니매이션, 저널링(journaling)을 지원하는 것과 같은 서비스가 해당된다.



     MarginProperty = DependencyProperty.Register("Margin",
     typeof(Thickness), typeof(FrameworkElement), metadata,
     new ValidataValueCallback(FrameworkElement.IsMarginValid));
     ...

     static DependencyProperty.Register()메서드를 호출하여 의존속성을 등록하는 단계이다.



Register 메서드의 Parameta
- 프로퍼티 이름, 여기서는 Margin이 된다.
- 프로퍼티가 사용할 데이터 타입, 이 예제에서는 Thickness 구조체가 된다.
- 이 프로퍼티를 소유하게 될 타입, 이 예제에서는 FrameworkElement 클래스가 된다.
- 선택적으로, 추가적인 프로퍼티 설정을 갖고 있는 FrameworkPropertyMetadata 개체.
- 선택적으로, 프로퍼티의 유효성 검사를 수행하는 콜백.


}


프로퍼티 유효성 검사

유효성 검사 콜백(validation callback)은  반드시 object 타입의 매개변수를 받아들이고, Boolean 타입의 값을 반환하는 메서드를 가리켜야 한다. 개체가 유효하다고 받아들이면 true값을 반환하고, 개체를 거부하려면 false값을 반환하면 된다.


예) FrameworkElement.Margin 프로퍼티의 유효성검사

FrameworkElement.IsMarginValid()메서드는 internal Thickness.IsValid()메서드에 의존하는데 Thickness.IsValid()메서드는 Thickness  개체가 마진을 표현하는 현재 용도로 유효한지를 확인한다.

private static bool IsMarginValid(object value)
{
     Thickness thickness1 = (Thickness) value;
     return thickness1.isValid(true, false, true, false);
}

제한사항 -  이 콜백은 static 메서드를 가리켜야 하며 유효성 검사가 수행되는 개체에는 접근할 수 없어야 한다는 것이다. 유효성 검사 콜백 메서드에서 얻을 수 있는 전부는 유효성 검사가 적용되는 의존 속성에 새롭게 적용되는 값뿐이다. 이러한 점은 유효성 검사 콜백을 쉽게 재사용하도록 해 주지만, 다른 프로퍼티를 고려하는 유효성 검사 루틴을 만들 수 없도록 해준다.


----------------------------------------------------미완------------------------------------------------

Posted by 아몰라