정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 종속성 속성

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

Windows Phone 에서는 CLR 속성의 기능을 확장하는 데 사용할 수 있는 서비스 집합을 제공합니다. 이러한 서비스를 통칭하여 Windows Phone 속성 시스템이라고 합니다. Windows Phone 속성 시스템의 지원을 받는 속성을 종속성 속성이라고 합니다. 이 개요에서는 Windows Phone 속성 시스템과 종속성 속성의 기능에 대해 설명합니다. 이 개요 부분에서는 종속성 메타데이터와 같은 종속성 속성의 특징 및 사용자 지정 클래스에 사용자 고유의 종속성 속성을 만드는 방법도 소개합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

이 항목에서는 독자가 CLR 및 개체 지향 프로그래밍에 대한 기본적인 지식을 갖고 있다고 가정합니다. 이 항목의 예제를 실행하려면 XAML에 대해서도 이해하고 있어야 하며 기반 앱을 작성하는 방법을 알고 있어야 합니다.

Windows Phone 에서는 종속성 속성이 일반적으로 CLR 속성으로도 노출됩니다. 가장 기본적인 수준에서는 이러한 속성과 직접 상호 작용하면서도 속성이 종속성 속성으로 구현된 사실을 모를 수 있습니다. 그러나 종속성 속성 기능을 활용하려면 Windows Phone 속성 시스템의 기능 전체 또는 일부에 익숙해져야 합니다.

종속성 속성은 다른 입력 값을 기준으로 속성 값을 계산하기 위한 용도로 사용됩니다. 여기서 다른 입력 값에는 사용자 기본 설정 등의 외부 속성, 데이터 바인딩 및 애니메이션/Storyboard와 같은 Just-In-Time 속성 결정 메커니즘, 리소스 및 스타일과 같은 다용도 템플릿, 개체 트리에서 다른 요소와의 부모-자식 관계를 통해 알 수 있는 값이 포함될 수 있습니다. 또한 다른 속성에 대한 변경을 전파할 수 있는 콜백을 제공하도록 종속성 속성을 구현할 수 있습니다.

DependencyObject이고 어떤 방법으로든 UI에 표시할 수 있는 Windows Phone 형식의 경우 개체에서 설정 가능한 대부분의 속성이 종속성 속성이므로 애니메이션을 지원할 수 있습니다. FrameworkElement 파생 형식의 경우 종속성 속성에서 스타일 지정도 지원할 수 있습니다. 읽기 전용 속성의 경우, WPF 호환성 때문에 종속성 속성으로 구현되는 읽기 전용 속성이 있긴 하지만 종속성 속성일 가능성이 적습니다. DependencyObject의 설정 가능한 속성이 종속성 속성이 아닌 드문 경우에 해당 속성은 애니메이션, 데이터 바인딩 또는 FrameworkElement 스타일 지정을 지원할 수 없습니다.

API 참조에서 지정된 Windows Phone 속성이 종속성 속성으로 구현된 경우 확실히 식별할 수 있습니다. 설명 부분에서 "종속성 속성 식별자 필드"와 이름이 Property로 끝나는 API(필드)에 대한 링크가 있는 경우 해당 속성은 종속성 속성입니다. 사용자 지정 또는 타사 종속성 속성도 이 필드 노출 및 이름 지정 규칙을 따라야 합니다. 예를 들어 형식에서 정의된 Ticks 속성과 동일한 형식이 노출하는 TicksProperty 필드가 있고 이 필드가 DependencyProperty 형식이면 Ticks는 종속성 속성입니다.

종속성 속성과 속성 시스템은 전용 필드를 사용하여 속성을 지원하는 표준 방식 대신 속성을 지원하는 속성 저장소를 제공하여 CLR 정의 속성 기능을 확장합니다. 저장소에서 각 속성을 식별하는 형식 이름은 DependencyProperty입니다. Windows Phone 속성 시스템을 정의하는 또 하나의 중요한 형식은 DependencyObject입니다. DependencyObject는 종속성 속성을 등록 및 소유할 수 있는 기본 클래스를 정의하며, 저장소에서 종속성 속성을 유지 관리하는 DependencyObject입니다.

다음은 이 설명서에서 종속성 속성을 설명하는 데 사용되는 용어를 정의한 것입니다.

  • 종속성 속성: DependencyObject에 있고 DependencyObject 속성 저장소에 저장되며 소유하는 DependencyObject에서 DependencyProperty 식별자로 식별되는 속성입니다.

  • 종속성 속성 식별자: DependencyProperty 인스턴스입니다. Windows Phone 핵심 API에 있는 기존 종속성 속성의 경우 이 인스턴스는 일반적으로 종속성 속성을 보유하는 동일한 DependencyObject 형식의 멤버로 public static readonly 필드로 노출됩니다. 사용자 지정 종속성 속성의 경우 이 필드는 종속성 속성을 등록할 때 반환 값으로 얻게 됩니다. 그런 다음 이 필드를 클래스의 멤버로 저장해야 합니다. 종속성 속성 식별자 필드는 Windows Phone 속성 시스템의 기본 항목을 노출하는 GetValueSetValue와 같은 API와 종속성 속성이 식별자(예: PropertyPath 생성자 또는 Setter.Property의 특정 서명)로 지정된 기타 API의 매개 변수로 사용될 수도 있습니다.

  • CLR 래퍼: 하위 수준 아키텍처로 작동하는 CLR 형식 시스템에 표시될 수 있는 속성에 대한 실제 getset 구현입니다. 이러한 구현은 종속성 속성 식별자를 GetValueSetValue 호출에 사용하여 통합함으로써 Windows Phone 속성 시스템을 통한 속성 지원 기능을 제공합니다. GetValue / SetValue 호출은 getset 구현 전체여야 합니다. 래퍼는 호출자의 편의를 위한 기능일 뿐만 아니라 리플렉션 또는 CLR 형식 시스템을 기반으로 하는 프로세스 또는 도구에 종속성 속성을 노출하기도 합니다. 따라서 대부분의 시나리오에서 매우 중요한 역할을 합니다.

다음 예제에서는 사용자 지정 IsSpinning 종속성 속성을 정의하고 DependencyProperty 식별자 및 이 식별자가 지원하는 속성 사이의 관계를 보여 줍니다.


public static readonly DependencyProperty IsSpinningProperty = 
    DependencyProperty.Register(
    "IsSpinning", typeof(Boolean),
    typeof(SilverlightExampleClass), null
    );
public bool IsSpinning
{
    get { return (bool)GetValue(IsSpinningProperty); }
    set { SetValue(IsSpinningProperty, value); }
}


참고참고:

 위의 예가 사용자 지정 종속성 속성을 만드는 방법에 대한 전체 예제는 아닙니다. 일반적인 코드를 통해 개념을 배우는 사용자에게 종속성 속성의 개념을 설명할 수 있도록 도와 주기 위한 것입니다.

일반적으로 Windows Phone 속성을 코드나 XAML에서 설정할 수 있습니다. 코드와 XAML을 구분하는 목적으로는 속성이 종속성 속성으로 지원되는지 여부가 별로 중요하지 않습니다. 두 방식 모두 속성이 설정 가능하고 속성을 설정하는 경우에는 속성 저장소를 구현하더라도 값은 속성 저장소에 속성을 보유하는 개체로 설정됩니다. 그러나 코드로만 설정 가능한 속성이 있습니다. 그 이유는 대부분의 경우 속성에 사용되는 형식을 XAML로 표현할 수 없기 때문입니다. 또한 DependencyProperty를 형식으로 사용하기 때문에 일반적으로 CLR 속성에는 적용되지 않고 종속성 속성에만 적용되는 특정 속성 관련 메커니즘이 있습니다. 예를 들어 스타일 및 템플릿에 사용되는 Setter.Property가 그러한 속성입니다.

XAML에서 속성 값 설정

XAML에서는 다양한 형식의 구문을 사용하여 속성을 설정할 수 있습니다. 가장 간단한 형식은 문자열 특성입니다. 특정 속성에 사용할 구문은 해당 속성이 값으로 사용하는 형식뿐만 아니라 형식 변환기가 있는지 여부와 같은 다른 요인에 따라 달라집니다. 속성 설정에 사용하는 XAML 구문에 대한 자세한 내용은 Windows Phone 8의 XAML를 참조하세요. XAML에 대한 특정 속성 사용법 구문은 일반적으로 참조 페이지의 구문 섹션에 있으며 예제 섹션에서도 흔히 찾을 수 있습니다.

구문 측면에서 Windows Phone XAML 파서는 표준 CLR 속성과 종속성 속성에서 지원되는 속성을 구분하지 않습니다. 각 속성이 문자열로 처리됩니다. 그러나 다음과 같은 몇 가지 XAML 속성 시스템 상호 작용이 있으므로 주의해야 합니다.

  • 종속성 속성만 Binding 또는 TemplateBinding 태그 확장을 사용하는 값을 수락할 수 있습니다. 이러한 값을 제공하는 것은 XAML 파서 자체가 아니라 속성 시스템이기 때문입니다.

  • Windows Phone XAML 파서는 임의 스타일 Setter 값을 설정할 때마다 CLR 래퍼를 건너뜁니다.

  • XAML에서 설정되는 임의 속성에 StaticResource 태그 확장을 사용할 수 있습니다. 속성이 종속성 속성이 아니어도 됩니다. 그러나 해당 속성이 XAML의 다른 곳에 정의된 대로 Windows Phone 리소스 사전에서 공유될 수 있는 값을 사용해야 합니다. 엄격히 말해서 이것은 속성 시스템 정의 동작이 아닙니다.

코드에서 속성 설정

코드에서 종속성 속성 값을 설정할 때는 일반적으로 CLR 래퍼가 노출하는 표준 CLR 속성을 사용합니다.

scratchCanvas.Width = 200; //scratchCanvas is an existing Canvas instance

속성을 값을 가져올 때도 기본적으로 표준 속성을 사용합니다.

double whatWidth = scratchCanvas.Width;

속성 시스템 API GetValueSetValue를 직접 호출할 수도 있습니다. 기존 속성을 사용하는 경우에는 래퍼가 더 편리하고 속성을 개발자 도구에 노출하는 데 더 유용하기 때문에 대개 이 방법을 사용하지 않아도 되지만 속성 시스템 API를 직접 호출하는 것이 더 적절한 시나리오도 있습니다. 이는 종속성 개체에 대한 실제 속성 저장소가 DependencyObject에서 구현되고 모든 DependencyObject 인스턴스에 사용할 수 있음을 나타냅니다.

초기에 로드되는 XAML에서 속성을 설정한 다음 여러 가지 방법(코드 숨김의 이벤트 처리기, 진입점으로 FindName 사용, 루트에서 개체 트리 검색 등)으로 런타임 개체 트리에 액세스하여 나중에 코드에서 액세스할 수도 있습니다.

필드에서 지원되는 속성과 달리 종속성 속성은 속성의 기능을 확장하는 기능을 제공합니다. 일반적으로 이러한 각 기능은 Windows Phone 의 전체 기능 집합 중에서 다음과 같은 특정 기능을 나타내거나 지원합니다.

데이터 바인딩

설정할 종속성 속성이 DependencyObject 서브클래스에 있으면 종속성 속성의 값이 데이터 바인딩을 통해 설정될 수 있습니다. 데이터 바인딩은 XAML의 특정 태그 확장 구문 또는 코드의 Binding 개체를 통해 작동합니다. 데이터 바인딩을 사용할 경우 속성의 최종 값은 데이터 소스로부터 값을 가져오는 런타임에 결정됩니다.

다음 예제에서는 XAML에서 바인딩을 사용하여 텍스트 블록의 텍스트를 설정합니다. 이 경우 바인딩에는 상속된 데이터 컨텍스트와 개체 데이터 소스(이 예제에서는 보여 주지 않음)가 사용됩니다.

    <Canvas>
      <TextBlock Text="{Binding Team.TeamName}"/>
    </Canvas> 

XAML 대신 코드를 사용하여 바인딩을 설정할 수도 있습니다. SetBinding을 참조하세요.

참고참고:

바인딩은 종속성 속성 값 우선 순위를 나타내는 로컬 값으로 처리되므로 다른 로컬 값을 설정하면 바인딩이 제거됩니다.

바인딩 소스, 바인딩 대상

바인딩 소스가 되기 위해 속성이 종속성 속성일 필요는 없습니다. 모든 CLR 속성을 바인딩 소스로 사용할 수 있습니다. 그러나 바인딩 대상이 되려면 속성이 종속성 속성이어야 합니다.

코드에 바인딩을 설정할 경우 SetBinding API는 FrameworkElement에 대해서만 정의됨을 알아두세요. 그러나 대신 BindingOperations를 사용하여 바인딩 정의를 작성할 수 있으며 따라서 DependencyObject 속성을 참조할 수 있습니다.

코드 또는 XAML에서 DataContextFrameworkElement 속성임을 잊지 마세요. 바인딩 시스템은 대상 속성을 가진 자식 개체가 FrameworkElement가 아니라서 고유의 DataContext 값이 없는 경우에도 부모-자식 형태의 속성 상속을 사용하여 부모 요소에 있는 DataContext를 확인할 수 있습니다. 그러나 해당 부모 요소는 DataContext를 설정하고 보유하기 위해 FrameworkElement여야 합니다. 또는 null인 DataContext에서 작동할 수 있도록 바인딩을 정의해야 합니다.

참고참고:

Windows Phone 을 대상으로 하는 앱은 FrameworkElement의 대상 속성에만 바인딩할 수 있습니다. DependencyObject 종속성 속성에 대한 바인딩 지원은 Windows Phone 에서 추가되었습니다.

단방향 또는 양방향 바인딩을 효율적으로 수행하려면 소스 속성이 바인딩 시스템 및 대상으로 전파되는 변경 알림을 지원해야 합니다. 이는 사용자 지정 CLR 바인딩 소스의 경우 속성이 INotifyPropertyChanged를 지원해야 함을 의미합니다. 컬렉션은 INotifyCollectionChanged를 지원해야 합니다. 특정 클래스는 데이터 바인딩 시나리오에 대한 기본 클래스로 사용되도록 구현에서 이러한 인터페이스 중 하나를 지원합니다. 해당 클래스의 예로 ObservableCollection<T>이 있습니다.

Windows Phone 의 데이터 바인딩 및 데이터 바인딩을 속성 시스템에 연결하는 방법에 대한 자세한 내용은 Windows Phone 8의 데이터 바인딩을 참조하세요.

스타일

스타일과 템플릿은 속성이 종속성 속성으로 정의되는 두 가지 주요 시나리오입니다. 특히 스타일은 앱 UI(사용자 인터페이스)를 정의하는 속성을 설정할 때 유용합니다. 일반적으로 스타일은 XAML에서 리소스(앱 수준 또는 페이지 수준 리소스 사전)로 정의되거나 전체적인 Windows Phone 앱모델에서 특정 역할을 수행하는 generic.xaml과 같은 XAML 파일에서 리소스로 정의됩니다. 스타일은 일반적으로 특정 속성의 "setter"를 포함하기 때문에 속성 시스템과 상호 작용합니다. 일반적으로 이런 식으로 설정되는 가장 중요한 속성은 ControlTemplate이며 Control의 시각적 모양과 시각적 상태의 대부분을 정의합니다.

Style을 정의하고 setter를 사용하는 예제 XAML 및 스타일에 대한 자세한 내용은 Style을 참조하세요.

애니메이션

애니메이션이 적용되려면 애니메이션의 대상 속성이 종속성 속성이어야 합니다. 또한 애니메이션이 적용되려면 대상 속성의 값 형식이 기존의 Timeline 파생 애니메이션 형식 중 하나에서 지원되어야 합니다.

애니메이션을 적용하고 실행할 경우, 애니메이션 값은 속성의 다른 모든 값(예: 로컬 값)보다 우선 순위가 높습니다. 애니메이션에는 HoldEnd 동작을 사용하여 애니메이션이 시각적으로 중지된 것처럼 보이는 경우에도 애니메이션이 속성 값에 적용되게 할 수 있는 선택적 동작도 있습니다.

Windows Phone 의 애니메이션은 시각적 장식 요소를 한 번 또는 반복적으로 생성하는 전형적인 애니메이션 용도로만 사용되지는 않습니다. 개별 속성의 상태나 특정 자극을 기반으로 하는 전체 컨트롤의 상태를 설정할 수 있는 상태 시스템 기법으로 애니메이션을 고려할 수 있습니다. 이 원칙은 컨트롤에 대한 VisualStateManager 상태 모델의 일부로 애니메이션을 사용함으로써 구현됩니다.

속성 변경 동작

속성 변경 동작은 종속성 속성이라는 용어의 "종속성" 부분에 대한 주요 이유 중 하나입니다. 다른 속성에 의해 영향을 받을 수 있는 값이 포함된 속성의 유효한 값을 유지 관리하는 것은 많은 플랫폼에서 어려운 개발 문제입니다. Windows Phone 종속성 속성 시스템은 각 종속성 속성에서 속성 값이 변경될 때마다 호출되는 콜백을 지정하는 기능을 기본적으로 구현합니다. 이 콜백을 사용하여 일반적으로 동기 방식으로 관련 속성 값을 알리거나 변경할 수 있습니다.

기존의 많은 Windows Phone 종속성 속성에는 속성 변경 동작이 있습니다. 이러한 동작을 사용자 지정 종속성 속성에 추가하고 고유의 속성 변경 콜백을 구현할 수도 있습니다.

기본값 및 ClearValue

종속성 속성에는 속성 메타데이터의 일부로 정의된 기본값이 있을 수 있습니다. 일반 속성 및 종속성 속성의 기본값 차이점은 값 우선 순위의 다른 결정자가 사라질 때마다 기본값이 적용될 수 있다는 것입니다(종속성 속성 값 우선 순위에 대한 자세한 내용은 다음 단원 참조). 예를 들어 속성에서 템플릿이나 애니메이션을 의도적으로 제거하지만 이렇게 한 후 값이 적당한 기본값이 되게 할 수 있습니다. 종속성 속성 기본값은 모든 경우에 특정하게 설정할 필요 없이 이 값을 제공합니다.

의도적으로 기본값으로 설정해야 하는 경우는 이미 로컬 값을 설정한 경우입니다. 속성을 다시 설정하면 로컬 값만 다시 설정되고 실제로 기본값이 복원되지 않습니다. 값을 기본값으로 다시 설정하고 로컬 값 우선 순위 아래에 속한 우선 순위의 다른 참가 요소가 다시 작동할 수 있게 하려면 속성에 대해 ClearValue를 호출합니다.

종속성 속성의 값을 가져올 때 Windows Phone 속성 시스템에 참여하는 속성 기반 입력 중 하나를 통해 해당 속성에 설정된 값을 가져올 수 있습니다. 종속성 속성 값의 우선 순위는 Windows Phone 속성이 속성 값을 가져오는 다양한 시나리오에서 예측 가능한 상호 작용을 위해 필요합니다.

예를 들어, 스타일과 템플릿은 속성 값과 컨트롤의 모양을 설정하기 위한 공유 시작점의 역할을 합니다. 그러나 특정 컨트롤 인스턴스에서 컨트롤의 속성 관련 측면을 공통 템플릿과 다르게 변경할 수 있습니다. 예를 들어, 다른 배경색이나 다른 텍스트 문자열을 콘텐츠로 제공할 수 잇습니다. Windows Phone 속성 시스템은 스타일과 템플릿에서 제공하는 값보다 높은 우선 순위로 로컬 값을 사용하므로 이 시나리오가 가능합니다.

연결된 속성은 Windows Phone 에서 특수 XAML 구문을 지원하는 속성 형식입니다. 연결된 속성은 대개 CLR 속성 계층 구조와 직접 대응되지 않습니다. 일반적으로 연결된 속성의 용도는 부모 요소와 자식 요소에 모두 일반화된 형식 시스템의 가능한 멤버로 속성이 들어 있지 않더라도 자식 요소에서 해당 속성 값을 부모 요소에 보고할 수 있도록 하는 것입니다. Windows Phone 에서 연결된 속성을 사용하는 한 가지 주요 시나리오는 자식 요소가 UI에 표시되는 방법을 부모에 알릴 수 있도록 하는 경우입니다. 이 시나리오의 예제는 Canvas.Left를 참조하세요.

표시: