종속성 속성 메타데이터(WPF .NET)

WPF(Windows Presentation Foundation) 속성 시스템은 종속성 속성 메타데이터 보고 시스템을 포함하고 있습니다. 메타데이터 보고 시스템을 통해 제공되는 정보는 리플렉션 또는 일반적인 CLR(공용 언어 런타임) 특성을 통해 제공되는 정보보다 많습니다. 종속성 속성을 등록할 때 메타데이터를 만들고 할당하는 옵션이 있습니다. 종속성 속성을 정의하는 클래스에서 파생하는 경우 상속된 종속성 속성에 대한 메타데이터를 재정의할 수 있습니다. 그리고 클래스를 종속성 속성의 소유자로 추가하는 경우 상속된 종속성 속성의 메타데이터를 재정의할 수 있습니다.

중요

.NET 6 및 .NET 5(.NET Core 3.1 포함)에 관한 데스크톱 가이드 설명서는 제작 중입니다.

필수 구성 요소

이 문서에서는 독자들이 종속성 속성에 대한 기본 지식을 갖고 있으며 종속성 속성 개요를 읽었다고 가정합니다. XAML(Extensible Application Markup Language)에 익숙하고 WPF 애플리케이션을 작성하는 방법을 알고 있으면 이 문서의 예제를 따라 하는 데 도움이 됩니다.

메타데이터 사용 방법

종속성 속성 메타데이터를 쿼리하여 종속성 속성의 특징을 검사할 수 있습니다. 속성 시스템은 종속성 속성을 처리할 때 메타데이터에 액세스 합니다. 종속성 속성의 메타데이터 개체에는 다음과 같은 유형의 정보가 포함되어 있습니다.

  • 종속성 속성의 기본값. 로컬, 스타일 또는 상속 값과 같은 다른 값이 적용되지 않으면 속성 시스템에서 이 값을 설정합니다. 종속성 속성 값의 런타임 할당 중 값 우선 순위에 대한 자세한 내용은 종속성 속성 값 우선 순위를 참조하세요.

  • 소유자 형식의 강제 변환 값 콜백 및 속성 변경 콜백에 대한 참조. public 액세스 한정자가 있거나 허용된 액세스 범위 내에 있는 콜백에 대한 참조만 가져올 수 있습니다. 종속성 속성 콜백에 대한 자세한 내용은 종속성 속성 콜백 및 유효성 검사를 참조하세요.

  • WPF 프레임워크 수준 종속성 속성 특성(종속성 속성이 WPF 프레임 워크 속성인 경우). 프레임워크 레이아웃 엔진 및 속성 상속 논리와 같은 WPF 프로세스는 WPF 프레임워크 수준 메타데이터를 쿼리합니다. 자세한 내용은 프레임워크 속성 메타데이터를 참조하세요.

메타데이터 API

PropertyMetadata 클래스는 속성 시스템에서 사용하는 대부분의 메타데이터를 저장합니다. 메타데이터 인스턴스는 다음과 같은 형식으로 만들고 할당할 수 있습니다.

  • 속성 시스템에 종속성 속성을 등록하는 형식

  • 종속성 속성을 정의하는 클래스에서 상속되는 형식

  • 자신을 종속성 속성의 소유자로 추가하는 형식

메타데이터를 지정하지 않고 형식에서 종속성 속성을 등록하는 경우 속성 시스템은 해당 형식의 기본값을 가진 PropertyMetadata 개체를 종속성 속성에 할당합니다.

종속성 속성에 대한 메타데이터를 검색하려면 GetMetadata 식별자의 DependencyProperty 오버로드 중 하나를 호출합니다. 메타데이터는 PropertyMetadata 개체로 반환됩니다.

PropertyMetadata에서 파생된 보다 구체적인 메타데이터 클래스는 다른 아키텍처 영역 때문에 존재합니다. 예를 들어 UIPropertyMetadata는 애니메이션 보고를 지원하고, FrameworkPropertyMetadata는 WPF 프레임워크 속성을 지원합니다. 종속성 속성은 PropertyMetadata 파생 클래스에 등록할 수도 있습니다. GetMetadataPropertyMetadata 개체를 반환하지만, 해당하는 경우 파생 형식으로 캐스팅하여 형식별 속성을 검사할 수 있습니다.

FrameworkPropertyMetadata를 통해 노출되는 속성 특성을 플래그라고도 합니다. FrameworkPropertyMetadata 인스턴스를 만들 때 열거형 형식 FrameworkPropertyMetadataOptions의 인스턴스를 FrameworkPropertyMetadata 생성자에 전달하는 옵션이 있습니다. FrameworkPropertyMetadataOptions에서는 메타데이터 플래그를 비트 조합으로 지정할 수 있습니다. FrameworkPropertyMetadataFrameworkPropertyMetadataOptions를 사용하여 생성자 서명의 길이를 합리적으로 유지합니다. 종속성 속성 등록 시 FrameworkPropertyMetadataOptions에서 설정한 메타데이터 플래그는 쿼리 메타데이터 특성을 보다 직관적으로 만들기 위해 FrameworkPropertyMetadata 내에서 플래그의 비트 조합이 아닌 Boolean로 노출됩니다.

새 메타데이터 재정의 또는 만들기

종속성 속성을 상속하는 경우 해당 메타데이터를 재정의하여 종속성 속성의 특성을 변경할 수 있습니다. 그러나 메타데이터를 재정의하여 종속성 속성 시나리오를 달성하지 못할 수도 있으며, 클래스에서 새 메타데이터를 사용하여 사용자 지정 종속성 속성을 정의해야 할 때도 있습니다. 사용자 지정 종속성 속성에는 WPF 형식에서 정의된 종속성 속성과 동일한 기능이 있습니다. 자세한 내용은 사용자 지정 종속성 속성을 참조하세요.

재정의할 수 없는 종속성 속성의 주요 특성 중 하나는 값 형식입니다. 상속된 종속성 속성에 필요한 대략적인 동작이 있지만 시나리오에 다른 값 형식이 필요한 경우 사용자 지정 종속성 속성을 구현하는 것이 좋습니다. 형식 변환 또는 파생 클래스의 다른 구현을 통해 속성 값을 연결할 수 있습니다.

메타데이터 재정의 시나리오

다음은 기존 종속성 속성 메타데이터를 재정의하는 예제 시나리오입니다.

  • 일반적인 시나리오인 기본값 변경

  • 속성 변경 콜백 변경 또는 추가. 상속된 종속성 속성이 기본 구현과 다르게 다른 종속성 속성과 상호 작용하는 경우에 필요할 수 있습니다. 코드와 태그를 모두 지원하는 프로그래밍 모델의 특징 중 하나는 속성 값을 임의의 순서로 설정할 수 있다는 것입니다. 이 요소는 속성 변경 콜백을 구현하는 방법에 영향을 줄 수 있습니다. 자세한 내용은 종속성 속성 콜백 및 유효성 검사를 참조하세요.

  • WPF 프레임워크 속성 메타데이터 옵션 변경. 일반적으로 메타데이터 옵션은 새 종속성 속성을 등록하는 동안 설정되지만, OverrideMetadata 또는 AddOwner 호출에서 메타데이터 옵션을 다시 지정할 수 있습니다. 프레임워크 속성 메타데이터를 재정의하는 방법에 대한 자세한 내용은 메타데이터 지정을 참조하세요. 종속성 속성을 등록할 때 프레임워크 속성 메타데이터 옵션을 설정하는 방법은 사용자 지정 종속성 속성을 참조하세요.

참고

유효성 검사 콜백은 메타데이터의 일부가 아니므로 메타데이터를 재정의하여 변경할 수 없습니다. 자세한 내용은 콜백 유효성 검사를 참조하세요.

메타데이터 재정의

새 종속성 속성을 구현할 때 Register 메서드의 오버로드를 사용하여 메타데이터를 설정할 수 있습니다. 클래스가 종속성 속성을 상속하는 경우 OverrideMetadata 메서드를 사용하여 상속된 메타데이터 값을 재정의할 수 있습니다. 예를 들어 OverrideMetadata를 사용하여 형식별 값을 설정할 수 있습니다. 자세한 정보와 코드 예제는 종속성 속성의 메타데이터 재정의를 참조하세요.

WPF 종속성 속성의 예는 Focusable입니다. FrameworkElement 클래스는 Focusable을 등록합니다. Control 클래스는 FrameworkElement에서 파생되고, Focusable 종속성 속성을 상속하고, 상속된 속성 메타데이터를 재정의합니다. 재정의는 기본 속성 값을 false에서 true로 변경하지만, 상속된 다른 메타데이터 값은 유지합니다.

대부분의 기존 종속성 속성은 가상 속성이 아니므로 상속된 구현은 기존 멤버를 숨기게 됩니다. 메타데이터 특성을 재정의하면 새 메타데이터 값이 원래 값을 대체하거나 두 값이 병합됩니다.

  • DefaultValue의 경우 새 값이 기존 기본값을 대체합니다. 재정의 메타데이터에서 DefaultValue를 지정하지 않으면 메타데이터에서 DefaultValue를 지정한 가장 가까운 상위 항목에서 값이 생성됩니다.

  • PropertyChangedCallback의 경우 기본 병합 논리는 모든 PropertyChangedCallback 값을 테이블에 저장하며, 저장된 모든 값은 속성 변경 시 호출됩니다. 콜백 순서는 클래스 깊이에 따라 결정됩니다. 계층의 기본 클래스에 의해 등록된 콜백이 먼저 실행됩니다.

  • CoerceValueCallback의 경우 새 값이 기존 CoerceValueCallback 값을 대체합니다. 재정의 메타데이터에서 CoerceValueCallback을 지정하지 않으면 메타데이터에서 CoerceValueCallback을 지정한 가장 가까운 상위 항목에서 값이 생성됩니다.

참고

기본 병합 논리는 Merge 메서드에 의해 구현됩니다. 해당 클래스에서 Merge를 재정의하여 종속성 속성을 상속하는 사용자 지정 병합 논리를 파생 클래스에서 지정할 수 있습니다.

클래스를 소유자로 추가

다른 클래스 계층에 등록된 종속성 속성을 "상속"하려면 AddOwner 메서드를 사용합니다. 이 메서드는 일반적으로 추가 클래스가 종속성 속성을 등록한 형식에서 파생되지 않은 경우에 사용됩니다. AddOwner 호출에서 추가 클래스는 상속된 종속성 속성에 대한 형식별 메타데이터를 만들고 할당할 수 있습니다. 속성 시스템에 완전하게 참가하려면 코드 및 태그를 통해 추가 클래스에서 다음 공용 멤버를 구현해야 합니다.

  • 종속성 속성 식별자 필드. 종속성 속성 식별자의 값은 AddOwner 호출의 반환 값입니다. 이 필드는 DependencyProperty 형식의 public static readonly 필드여야 합니다.

  • getset 접근자를 구현하는 CLR 래퍼. 종속성 속성의 소비자는 속성 래퍼를 사용하여 다른 CLR 속성과 마찬가지로 종속성 속성 값을 가져오거나 설정할 수 있습니다. getset 접근자는 DependencyObject.GetValueDependencyObject.SetValue 호출을 통해 기본 속성 시스템과 상호 작용하여 종속성 속성 식별자를 매개 변수로 전달합니다. 사용자 지정 종속성 속성을 등록할 때와 동일한 방식으로 래퍼를 구현합니다. 자세한 내용은 사용자 지정 종속성 속성을 참조하세요.

AddOwner를 호출하는 클래스의 요구 사항은 상속된 종속성 속성의 개체 모델을 새 사용자 지정 종속성 속성을 정의하는 클래스로 노출하기 위한 요구 사항과 동일합니다. 자세한 내용은 종속성 속성의 소유자 형식 추가를 참조하세요.

연결된 속성 메타데이터

WPF에서 WPF 형식의 UI 관련 연결된 속성은 대부분 종속성 속성으로 구현됩니다. 종속성 속성으로 구현된 연결된 속성은 파생 클래스가 재정의할 수 있는 메타데이터와 같은 종속성 속성 개념을 지원합니다. 연결된 속성에 대한 메타데이터는 일반적으로 종속성 속성과 차이가 없습니다. 재정의 클래스의 인스턴스에서 상속된 연결된 속성에 대한 기본값, 속성 변경 콜백 및 WPF 프레임워크 속성을 재정의할 수 있습니다. 자세한 내용은 연결된 속성 메타데이터를 참조하세요.

참고

항상 사용 하 여 RegisterAttached 지정 하는 속성을 등록 하려면 Inherits 메타 데이터에서입니다. 속성 값 상속이 연결되지 않은 종속성 속성에 대해서도 작동하는 것처럼 보일 수 있지만, 런타임 트리의 개체-개체 나누기를 통해 연결되지 않은 속성에 대한 값 상속 동작은 정의되지 않았습니다. Inherits 속성은 연결되지 않은 속성과 관련이 없습니다. 자세한 내용은 RegisterAttached(String, Type, Type, PropertyMetadata)Inherits의 설명 섹션을 참조하세요.

연결된 속성의 소유자로 클래스 추가

다른 클래스에서 연결된 속성을 상속하지만 연결되지 않은 종속성 속성으로 클래스에 노출하려면 다음을 수행합니다.

  • AddOwner를 호출하여 클래스를 연결된 종속성 속성의 소유자로 추가합니다.

  • 종속성 속성 식별자로 사용할 수 있도록 AddOwner 호출의 반환 값을 public static readonly 필드에 할당합니다.

  • 속성을 클래스 멤버로 추가하고 연결되지 않은 속성 사용을 지원하는 CLR 래퍼를 정의합니다.

참고 항목