연결된 속성 개요

연결된 속성은 XAML로 정의되는 개념입니다. 연결된 속성을 모든 종속성 개체에 설정할 수 있는 전역 속성의 한 형식으로 사용할 수 있습니다. WPF(Windows Presentation Foundation)에서 연결된 속성은 일반적으로 기존 속성 "래퍼"가 없는 종속성 속성의 특수 양식으로 정의됩니다.

사전 요구 사항

이 문서에서는 WPF(Windows Presentation Foundation) 클래스의 기존 종속성 속성의 소비자 관점에서 종속성 속성을 이해하고 종속성 속성 개요를 읽었다고 가정합니다. 이 문서의 예를 따르려면 XAML을 이해하고 WPF 애플리케이션을 작성하는 방법도 알아야 합니다.

연결된 속성 를 사용하는 이유

연결된 속성의 한 가지 목적은 다른 자식 요소가 부모 요소에서 정의되는 속성의 고유 값을 저장하도록 하는 것입니다. 이 시나리오의 특정 애플리케이션에서 자식 요소는 부모 요소에 UI(사용자 인터페이스)에서 표시되는 방법을 알립니다. 한 가지 예는 DockPanel.Dock 속성입니다. DockPanel.Dock 속성은 DockPanel 자체가 아닌 DockPanel 내에 포함된 요소로 설정될 수 있도록 설계되었으므로 연결된 속성으로 생성됩니다. DockPanel 클래스는 DockProperty라는 정적 DependencyProperty 필드를 정의한 다음, GetDockSetDock 메서드를 연결된 속성의 공용 접근자로 제공합니다.

XAML 에서 연결된 속성

XAML에서 구문 AttachedPropertyProvider. PropertyName을 사용하여 연결된 속성을 설정합니다.

다음은 XAML에서 DockPanel.Dock를 설정하는 방법의 예입니다.

<DockPanel>
    <TextBox DockPanel.Dock="Top">Enter text</TextBox>
</DockPanel>

사용법은 정적 속성과 어느 정도 유사합니다. 이름으로 지정된 인스턴스를 참조하지 않고 연결된 속성을 소유하고 등록하는 DockPanel 유형을 항상 참조합니다.

또한 XAML에서 연결된 속성은 표시로 설정한 특성이므로 집합 작업만 관련됩니다. 스타일의 트리거와 같은 값을 비교하기 위한 일부 간접 메커니즘이 있더라도 XAML에서 속성을 직접 가져올 수 없습니다(자세한 내용은 스타일 및 템플릿 참조).

WPF에서 연결된 속성 구현

WPF(Windows Presentation Foundation)에서는 WPF 형식의 UI 관련 연결된 속성 대부분이 종속성 속성으로 구현됩니다. 연결된 속성은 XAML 개념이지만 종속성 속성은 WPF 개념입니다. WPF 연결된 속성은 종속성 속성이므로 속성 메타데이터와 같은 종속성 속성 개념과 해당 속성 메타데이터의 기본값을 지원합니다.

소유 형식 에서 연결된 속성을 사용하는 방법

연결된 속성을 개체에 설정할 수 있지만, 속성 설정이 명확한 결과를 생성하거나 다른 개체에서 값을 사용함을 의미하지 않습니다. 일반적으로 다양한 논리적 관계 또는 클래스 계층 구조의 개체가 연결된 속성을 정의하는 형식에 각 보고서 공통 정보를 보고할 수 있도록 연결된 속성이 사용됩니다. 연결된 속성을 정의하는 형식은 이러한 모델 중 하나를 따릅니다.

  • 연결된 속성의 값을 설정하는 요소의 부모 요소가 될 수 있도록 연결된 속성을 정의하는 형식을 사용할 수 있습니다. 그러면 형식은 일부 개체 트리 구조에 대조적으로 내부 논리를 통해 자식 개체를 반복하며, 값을 가져오며 다른 방법으로 이러한 값에 작업을 수행합니다.

  • 연결된 속성을 정의하는 형식은 가능한 다양한 부모 요소와 콘텐츠 모델에 대한 자식 요소로 사용됩니다.

  • 연결된 속성을 정의하는 형식은 서비스를 나타냅니다. 다른 형식은 연결된 속성에 대한 값을 설정합니다. 그런 다음 속성을 설정하는 요소를 서비스의 컨텍스트에서 계산하는 경우, 연결된 속성 값은 서비스 클래스의 내부 논리를 통해 얻습니다.

부모 정의되어 연결된 속성의 예

WPF가 연결된 속성을 정의하는 가장 일반적인 시나리오는 부모 요소에서 자식 요소 컬렉션을 지원하는 경우이며 동작 세부 사항이 각 자식 요소에 개별적으로 보고되는 동작도 구현합니다.

DockPanelDockPanel.Dock 연결된 속성을 정의하고 DockPanel에는 렌더링 논리(특히 및 MeasureOverrideArrangeOverride)의 일부로 클래스 수준 코드가 있습니다. DockPanel 인스턴스는 직계 자식 요소가 DockPanel.Dock 값을 설정했는지 여부를 항상 확인합니다. 그런 경우, 이 값은 해당 자식 요소에 적용된 렌더링 논리에 대한 입력이 됩니다. 중첩된 DockPanel 인스턴스 각각은 자체 직계 자식 요소 컬렉션을 처리하지만 동작은 DockPanel에서 DockPanel.Dock 값을 처리하는 방식별로 구현됩니다. 이론적으로 직계 부모를 넘어서 요소에 영향을 주는 연결된 속성이 있을 수 있습니다. DockPanel.Dock 연결된 속성이 DockPanel 부모 요소가 없는 요소에서 작동하도록 설정되면 오류나 예외가 발생하지 않습니다. 즉, 전역 속성 값이 설정되었지만 정보를 사용할 수 있는 현재 DockPanel 부모가 없습니다.

코드 에서 연결된 속성

WPF의 연결된 속성에는 손쉬운 get/set 액세스를 위한 일반적인 CLR "래퍼" 메서드가 없습니다. 연결된 속성은 속성이 설정된 인스턴스의 CLR 네임스페이스의 일부가 아니어도 되기 때문입니다. 그러나 XAML 프로세서는 XAML을 구문 분석할 때 이러한 값을 설정할 수 있어야 합니다. 효과적인 연결된 속성 사용을 지원하려면 연결된 속성의 소유자 형식에서 전용 접근자 메서드를 GetPropertyNameSetPropertyName 양식으로 구현해야 합니다. 이 전용 접근자 메서드는 코드로 연결된 속성을 가져오거나 설정하는 데도 유용합니다. 코드의 관점에서 연결된 속성은 속성 접근자 대신 메서드 접근자가 있는 지원 필드와 유사하며, 지원 필드는 구체적으로 정의될 필요 없이 모든 개체에 있을 수 있습니다.

다음 예제에서는 코드에서 연결된 속성을 설정하는 방법을 보여 줍니다. 이 예에서 myCheckBoxCheckBox 클래스의 인스턴스입니다.

DockPanel myDockPanel = new DockPanel();
CheckBox myCheckBox = new CheckBox();
myCheckBox.Content = "Hello";
myDockPanel.Children.Add(myCheckBox);
DockPanel.SetDock(myCheckBox, Dock.Top);
Dim myDockPanel As New DockPanel()
Dim myCheckBox As New CheckBox()
myCheckBox.Content = "Hello"
myDockPanel.Children.Add(myCheckBox)
DockPanel.SetDock(myCheckBox, Dock.Top)

XAML 경우와 마찬가지로, myCheckBox를 코드의 4번째 줄에서 myDockPanel의 자식 요소로 추가하지 않으면 코드의 5번째 줄에서 예외가 발생하지 않지만 속성 값은 DockPanel 부모와 상호 작용하지 않으므로 아무 작업도 수행하지 않습니다. DockPanel 부모 요소와 결합된 자식 요소에서 설정한 DockPanel.Dock 값에 의해서만 렌더링된 애플리케이션에 효과적인 동작이 발생합니다. (이 경우 연결된 속성을 설정한 다음, 트리에 연결할 수 있습니다. 또는 트리에 연결한 다음, 연결된 속성을 설정할 수 있습니다. 두 작업 순서 모두 동일한 결과를 제공합니다.)

연결된 속성 메타데이터

속성을 등록하는 경우 FrameworkPropertyMetadata를 설정하여 속성이 렌더링 또는 측정에 영향을 주는지 여부와 같은 속성의 특징을 지정합니다. 연결된 속성에 대한 메타데이터는 일반적으로 종속성 속성과 차이가 없습니다. 연결된 속성 메타데이터 재정의에서 기본값을 지정하는 경우, 해당 값은 재정의 클래스의 인스턴스에서 암시적 연결된 속성의 기본값이 됩니다. 특히, 일부 프로세스가 해당 속성에 대한 Get 메서드 접근자를 통해 연결된 속성의 값을 쿼리하는 경우 기본값이 보고되어, 메타데이터를 지정한 클래스의 인스턴스 및 연결된 속성이 설정되지 않은 값을 지정합니다.

속성에 속성 값 상속을 사용하도록 설정하려는 경우, 연결되지 않은 종속성 속성이 아니라 연결된 속성을 사용해야 합니다. 자세한 내용은 속성 값 상속을 참조하십시오.

사용자 지정 연결된 속성

연결된 속성 를 만들어야 하는 경우

클래스 정의 외에 클래스에 사용할 수 있는 메커니즘을 설정하는 이유가 있는 경우 연결된 속성을 만들 수 있습니다. 이에 대한 가장 일반적인 시나리오는 레이아웃입니다. DockPanel.Dock, Panel.ZIndexCanvas.Top이 기존 레이아웃 속성에 대한 예입니다. 여기에서 사용 가능한 시나리오에서는 레이아웃 제어 요소에 대한 자식 요소로 존재하는 요소가 개별적으로 해당 레이아웃 부모 요소에 대한 레이아웃 요구사항을 표현할 수 있으며, 각각은 부모가 연결된 속성으로 정의한 속성 값을 설정합니다.

연결된 속성을 사용하기 위한 다른 시나리오는 클래스가 서비스를 나타내는 경우이며, 클래스는 서비스를 더 투명하게 통합할 수 있습니다.

또 다른 시나리오는 속성 창 편집과 같이 Visual Studio WPF 디자이너 지원을 받는 것입니다. 자세한 내용은 컨트롤 제작 개요를 참조하세요.

앞서 언급했듯이, 속성 값 상속을 사용하려는 경우 연결된 속성으로 등록해야 합니다.

연결된 속성 를 만드는 방법

클래스에서 다른 유형에 사용할 수 있도록 연결된 속성을 엄격하게 정의하는 경우 클래스는 DependencyObject에서 파생되면 안 됩니다. 그러나 연결된 속성이 종속성 속성이기도 하는 전체 WPF 모델을 따르는 경우 DependencyObject에서 파생되어야 합니다.

DependencyProperty 형식의 public static readonly 필드를 선언하여 연결된 속성을 종속성 속성으로 정의합니다. RegisterAttached 메서드의 반환 값을 사용하여 이 필드를 정의합니다. 나타내는 속성과 필드를 식별하는 이름을 지정하는 설정된 WPF 패턴을 따르려면 필드 이름이 Property 문자열이 추가된 연결된 속성 이름과 일치해야 합니다. 또한 연결된 속성 공급자에서 정적 GetPropertyNameSetPropertyName 메서드를 연결된 속성의 접근자로 제공해야 합니다. 이렇게 하지 않으면 속성 시스템에서 연결된 속성을 사용할 수 없게 됩니다.

참고

연결된 속성의 get 접근자를 생략하면 속성에 대한 데이터 바인딩은 Visual Studio 및 Blend for Visual Studio와 같은 디자인 도구에서 작동하지 않습니다.

Get 접근자

GetPropertyName 접근자의 서명은 다음과 같아야 합니다.

public static object GetPropertyName(object target)

  • 구현에서 보다 구체적인 형식으로 target 개체를 지정할 수 있습니다. 예를 들어 연결된 속성이 UIElement 인스턴스에서만 설정되므로 DockPanel.GetDock 메서드는 매개 변수를 UIElement으로 형식화합니다.

  • 구현에서 보다 구체적인 형식으로 반환 값을 지정할 수 있습니다. 예를 들어 값을 해당 열거형으로만 설정할 수 있으므로 GetDock 메서드는 Dock으로 형식화됩니다.

Set 접근자

SetPropertyName 접근자의 서명은 다음과 같아야 합니다.

public static void SetPropertyName(object target, object value)

  • 구현에서 보다 구체적인 형식으로 target 개체를 지정할 수 있습니다. 예를 들어 연결된 속성이 UIElement 인스턴스에서만 설정되므로 SetDock 메서드는 UIElement으로 형식화합니다.

  • 구현에서 보다 구체적인 형식으로 value 개체를 지정할 수 있습니다. 예를 들어 값을 해당 열거형으로만 설정할 수 있으므로 SetDock 메서드는 Dock으로 형식화됩니다. 태그의 연결된 속성 사용에서 연결된 속성에 있는 경우, 이 메서드의 값은 XAML 로더에서 오는 입력값임을 기억하십시오. 해당 입력값은 태그에는 XAML 특성 값으로 지정된 값입니다. 따라서 형식 변환, 값 직렬 변환기 또는 사용하는 형식에 대한 태그 확장 지원이 있어야, 적절한 형식이 특성 값(궁극적으로 문자열만)에서 생성될 수 있습니다.

다음 예제에서는 종속성 속성 등록(RegisterAttached 메서드 사용)뿐만 아니라 GetPropertyNameSetPropertyName 접근자를 보여줍니다. 예제에서 연결된 속성 이름은 IsBubbleSource입니다. 따라서 접근자의 이름은 GetIsBubbleSourceSetIsBubbleSource입니다.

public static readonly DependencyProperty IsBubbleSourceProperty = DependencyProperty.RegisterAttached(
  "IsBubbleSource",
  typeof(Boolean),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender)
);
public static void SetIsBubbleSource(UIElement element, Boolean value)
{
  element.SetValue(IsBubbleSourceProperty, value);
}
public static Boolean GetIsBubbleSource(UIElement element)
{
  return (Boolean)element.GetValue(IsBubbleSourceProperty);
}
Public Shared ReadOnly IsBubbleSourceProperty As DependencyProperty = DependencyProperty.RegisterAttached("IsBubbleSource", GetType(Boolean), GetType(AquariumObject), New FrameworkPropertyMetadata(False, FrameworkPropertyMetadataOptions.AffectsRender))
Public Shared Sub SetIsBubbleSource(ByVal element As UIElement, ByVal value As Boolean)
    element.SetValue(IsBubbleSourceProperty, value)
End Sub
Public Shared Function GetIsBubbleSource(ByVal element As UIElement) As Boolean
    Return CType(element.GetValue(IsBubbleSourceProperty), Boolean)
End Function

연결된 속성 특성

WPF는 리플렉션 프로세스, 리플렉션의 일반 사용자 및 속성 정보(예: 디자이너)에 대한 연결된 속성의 정보를 제공하는 여러 .NET 특성을 정의합니다. 연결된 속성에 제한이 없는 범위의 형식이 있기 때문에 디자이너는 XAML을 사용하는 특정 기술 구현에 정의된 모든 연결된 속성의 전역 목록을 사용하여 사용자의 과부하를 피할 수 있는 방법이 필요합니다. WPF에서 연결된 속성을 정의하는 .NET 특성은 지정된 연결된 속성이 속성 창에 표시되어야 하는 경우의 범위를 지정하는 데 사용될 수 있습니다. 또한 사용자 고유의 사용자 지정 연결된 속성에 대한 이러한 특성을 적용하는 것이 좋습니다. .NET 특성의 용도와 구문은 해당 참조 페이지에 설명되어 있습니다.

연결된 속성 자세히 알아보기

  • 연결된 속성을 만드는 방법에 대한 자세한 내용은 연결된 속성 등록을 참조하십시오.

  • 종속성 속성 및 연결된 속성에 대한 고급 사용 시나리오는 사용자 지정 종속성 속성을 참조하십시오.

  • 연결된 속성 및 종속성 속성으로 속성을 등록할 수도 있지만 "래퍼" 구현이 여전히 표시됩니다. 이 경우 속성은 해당 요소 또는 XAML 연결된 속성 구문을 통해 모든 요소에 설정될 수 있습니다. FrameworkElement.FlowDirection는 표준 사용과 연결된 사용 시나리오 모두에 적절한 속성 예입니다.

참고 항목