다음을 통해 공유


방법: 종속성 속성의 메타데이터 재정의

이 예제에서는 OverrideMetadata 메서드를 호출하고 형식별 메타데이터를 제공하여 상속된 클래스에서 가져온 기본 종속성 속성 메타데이터를 재정의하는 방법을 보여 줍니다.

예제

해당 PropertyMetadata를 정의하여 클래스에서 기본값과 속성 시스템 콜백과 같은 종속성 속성의 동작을 정의할 수 있습니다. 여러 종속성 속성 클래스에는 이미 등록 프로세스의 일부로 설정된 기본 메타데이터가 있습니다. 여기에 WPF API의 일부인 종속성 속성이 포함됩니다. 해당 클래스 상속을 통해 종속성 속성을 상속받는 클래스에서는 원래 메타데이터를 재정의할 수 있으므로 메타데이터를 통해 변경할 수 있는 속성의 특성이 모든 서브클래스별 요구 사항과 일치합니다.

종속성 속성에 대한 메타데이터의 재정의는 속성 시스템이 해당 속성을 사용하기 전에 수행되어야 합니다(속성을 등록하는 개체의 특정 인스턴스가 인스턴스화되는 시간과 같은 것으로 간주). OverrideMetadata 호출은 자체를 OverrideMetadataforType 매개변수로 제공하는 유형의 정적 생성자 안에서 실시해야 합니다. 소유자 형식의 인스턴스가 존재하는 메타데이터를 변경하려고 하면 예외가 발생하지는 않지만 속성 시스템에서 일관성 없는 동작이 발생합니다. 또한 메타데이터 형식별로 한 번만 재정의할 수 있습니다. 동일한 형식의 메타데이터를 이어서 재정의하려고 하면 예외가 발생합니다.

다음 예제에서는 사용자 정의 클래스 MyAdvancedStateControlMyStateControl에 의해 StateProperty에 제공된 메타데이터를 새 속성 메타데이터로 재정의합니다. 예를 들어 새로 생성된 MyAdvancedStateControl 인스턴스에서 속성을 쿼리하면 StateProperty의 기본값이 true가 됩니다.

public class MyStateControl : ButtonBase
{
  public MyStateControl() : base() { }
  public Boolean State
  {
    get { return (Boolean)this.GetValue(StateProperty); }
    set { this.SetValue(StateProperty, value); }
  }
  public static readonly DependencyProperty StateProperty = DependencyProperty.Register(
    "State", typeof(Boolean), typeof(MyStateControl),new PropertyMetadata(false));
}
Public Class MyStateControl
    Inherits ButtonBase
  Public Sub New()
      MyBase.New()
  End Sub
  Public Property State() As Boolean
    Get
        Return CType(Me.GetValue(StateProperty), Boolean)
    End Get
    Set(ByVal value As Boolean)
        Me.SetValue(StateProperty, value)
    End Set
  End Property
  Public Shared ReadOnly StateProperty As DependencyProperty = DependencyProperty.Register("State", GetType(Boolean), GetType(MyStateControl),New PropertyMetadata(False))
End Class
public class MyAdvancedStateControl : MyStateControl
{
  public MyAdvancedStateControl() : base() { }
  static MyAdvancedStateControl()
  {
    MyStateControl.StateProperty.OverrideMetadata(typeof(MyAdvancedStateControl), new PropertyMetadata(true));
  }
}
Public Class MyAdvancedStateControl
    Inherits MyStateControl
  Public Sub New()
      MyBase.New()
  End Sub
  Shared Sub New()
    MyStateControl.StateProperty.OverrideMetadata(GetType(MyAdvancedStateControl), New PropertyMetadata(True))
  End Sub
End Class

참고 항목