연결된 속성 개요

결합속성은 XAML로 정의된 개념입니다. 결합속성을 사용하면 개체에서 추가 속성/값 쌍을 설정할 수 있지만 속성은 원래 객체 정의의 일부가 아닙니다. 결합속성은 대체로 소유자 타입의 객체 모델에서의 기존 속성 래퍼가 없는 특수한 형식의 종속성 속성으로 정의됩니다.

필수 조건

종속성 속성에 대한 기본 지식을 갖고 있으며 종속성 속성 개요를 읽었다고 가정합니다.

XAML의 연결된 속성

XAML에서, AttachedPropertyProviderName 구문을 사용하여 결합속성을 설정합니다. 다음의 예는 XAML에서 Canvas.Left를 설정하는 방법을 보여줍니다.

<Canvas>
  <Button Canvas.Left="50">Hello</Button>
</Canvas>

참고 항목

사용 이유를 자세히 설명하지는 않고 Canvas.Left를 연결된 속성 예제로 사용합니다. Canvas.Left의 용도와 Canvas에서 자식 레이아웃을 처리하는 방법에 대해 자세히 알아보려면 참조 항목 또는 XAML을 사용하여 레이아웃 정의를 참조하세요.

결합속성을 사용하는 이유

결합속성은 관계 속 다른 객체끼리 런타임에 서로 정보를 전달하지 못하도록 하는 코딩 규칙을 이스케이프하는 한 가지 방법입니다. 각 객체가 해당 속성을 가져와서 설정할 수 있도록 공통 기본 클래스에 속성을 배치할 수 있습니다. 그러나 결국 작업을 수행 할 수 있는 많은 시나리오에서 공유 가능한 속성으로 기본 클래스를 블로트합니다. 속성을 사용하려고 하는 수백 개의 하위 항목 중 두 개만 있을 수 있는 경우도 있습니다. 좋은 클래스 디자인이 아닙니다. 이 문제를 해결하기 위해 결합속성 개념을 사용하면 자체 클래스 구조에서 정의하지 않는 속성의 값을 객체가 할당할 수 있게 됩니다. 객체 트리에서 다양한 객체가 만들어진 후 정의 클래스가 런타임에 자식 객체의 값을 읽을 수 있습니다.

예를 들어 자식 요소는 결합속성을 사용하여 UI에 표시되는 방법을 부모 요소에 알릴 수 있습니다. 이는 Canvas.Left 결합속성의 경우입니다. Canvas.Left는 Canvas 자체가 아닌 Canvas 속성의 요소로 설계되었으므로 연결된 속성으로 생성됩니다. 가능한 모든 자식 요소는 Canvas.LeftCanvas.Top을 사용하여 Canvas 레이아웃의 부모 컨테이너 오프셋을 지정합니다. 결합속성을 사용하면 작업을 수행하는 과정에서 가능한 많은 레이아웃 컨테이너 중 하나에만 적용되는 많은 속성을 갖고 있는 기본 요소의 객체 모델을 어지럽히지 않을 수 있습니다. 대신, 레이아웃 컨테이너 대부분은 자체 결합속성 세트를 구현합니다.

결합속성을 구현하기 위해, Canvas가 Canvas.LeftProperty라고 이름이 붙은 정적 종속성 속성을 정의합니다. 그런 다음, Canvas는 결합속성에 대한 공용 접근자로 SetLeft 및 GetLeft 메서드를 제공하여 XAML 설정과 런타임 값 액세스를 모두 사용하도록 합니다. XAML 및 종속성 속성 시스템의 경우 해당 API 집합이 결합속성에 대한 특정 XAML 구문을 사용할 수 있게 하고 종속성 속성 저장소에 값을 저장하는 패턴을 충족합니다.

소유 타입에서 결합속성을 사용하는 방법

결합속성을 모든 XAML 요소(또는 기본 종속성 객체)에서 설정할 수 있지만 속성 설정이 당연히 실질적인 결과를 생성하거나 값에 액세스한다는 것을 의미하지는 않습니다. 결합속성을 정의하는 타입은 다음의 시나리오 중 하나를 따릅니다.

  • 결합속성을 정의하는 타입은 다른 객체의 관계 속에서 부모입니다. 자식 객체는 결합속성에 대한 값을 설정합니다. 결합속성 소유자 타입에는 자식 요소를 반복하고, 값을 가져오며, 개체 수명( 레이아웃 작업, SizeChanged 등)의 특정 시점에 해당 값에 대해 작동하는 타고난 동작 몇 가지가 있습니다.
  • 결합속성을 정의하는 타입은 가능한 한 많은 부모 요소와 콘텐츠 모델에 대한 자식 요소로 사용되지만, 해당 정보가 반드시 레이아웃 정보인 것은 아닙니다.
  • 결합속성은 다른 UI 요소가 아니라 서비스에 정보를 보고합니다.

이러한 시나리오 및 소유 타입에 대한 자세한 내용은 사용자 지정 결합속성의 "Canvas.Left에 대한 자세한 정보" 섹션을 참조하세요.

코드의 연결된 속성

다른 종속성 속성과 마찬가지로 결합속성 또한 쉽게 액세스하고 설정할 수 있는 일반적인 속성 래퍼가 없습니다. 이는 결합속성이 속성이 설정된 인스턴스에 대한 코드중심의 객체 모델의 일부가 아니어도 되기 때문입니다. (일반적이지는 않지만 다른 타입이 스스로 설정할 수 있는 결합속성이자 소유 타입에 대한 기존의 속성 사용이 있는 속성을 정의하는 것은 허용됩니다.)

코드에서 결합속성을 설정하는 방법은 두 가지가 있습니다. 속성 시스템 API를 사용하거나 XAML 패턴 접근자를 사용합니다. 이러한 기술은 최종 결과 측면에서 거의 동일하므로, 어떤 기술을 사용할 지는 주로 코딩 스타일 차원의 문제입니다.

속성 시스템 사용하기

Windows 런타임의 결합속성은 종속성 속성으로 구현되므로 속성 시스템을 통해 공유 종속성 속성 저장소에 값을 저장할 수 있습니다. 따라서 결합속성은 소유 클래스에 종속성 속성 식별자를 노출합니다.

코드에서 결합속성을 설정하려면 SetValue 메서드를 호출하고, 결합속성의 식별자 역할을 하는 종속성 속성 필드를 전달합니다. (또한 값을 세트에 전달합니다.)

코드에서 결합속성의 값을 얻으려면 GetValue 메서드를 호출하고, 식별자 역할을 하는 DependencyProperty 필드를 다시 전달합니다.

XAML 접근자 패턴 사용하기

XAML을 객체 트리로 구문 분석할 때 XAML 프로세서는 결합속성 값을 설정할 수 있어야 합니다. 결합속성의 소유자 타입은 GetPropertyNameSetPropertyName타입으로 전용 접근자 메서드를 구현해야 합니다. 이 전용 접근자 메서드는 코드에 있는 결합속성을 가져오거나 설정하는 방법 중 하나입니다. 코드의 관점에서 보자면, 결합속성은 속성 접근자 대신 메서드 접근자를 갖고 있는 지원 필드와 유사하며, 지원 필드는 구체적으로 정의될 필요 없이 모든 객체에 있을 수 있습니다.

다음 예제에서는 XAML 접근자 API를 통해 코드에서 결합속성을 설정하는 방법을 보여줍니다. 이 예에서, myCheckBox 가 체크박스 클래스의 인스턴스입니다. 마지막 줄이 실제로 값을 설정하는 코드입니다. 바로 그 이전 줄은 인스턴스와 해당 부모-자식 관계를 설정합니다. 속성 시스템을 사용하는 경우 주석 처리되지 않은 마지막 줄이 구문입니다. 주석이 추가된 마지막 줄이 XAML 접근자 패턴을 사용하는 경우 구문입니다.

    Canvas myC = new Canvas();
    CheckBox myCheckBox = new CheckBox();
    myCheckBox.Content = "Hello";
    myC.Children.Add(myCheckBox);
    myCheckBox.SetValue(Canvas.TopProperty,75);
    //Canvas.SetTop(myCheckBox, 75);
    Dim myC As Canvas = New Canvas()
    Dim myCheckBox As CheckBox= New CheckBox()
    myCheckBox.Content = "Hello"
    myC.Children.Add(myCheckBox)
    myCheckBox.SetValue(Canvas.TopProperty,75)
    ' Canvas.SetTop(myCheckBox, 75)
Canvas myC;
CheckBox myCheckBox;
myCheckBox.Content(winrt::box_value(L"Hello"));
myC.Children().Append(myCheckBox);
myCheckBox.SetValue(Canvas::TopProperty(), winrt::box_value(75));
// Canvas::SetTop(myCheckBox, 75);
    Canvas^ myC = ref new Canvas();
    CheckBox^ myCheckBox = ref new CheckBox();
    myCheckBox->Content="Hello";
    myC->Children->Append(myCheckBox);
    myCheckBox->SetValue(Canvas::TopProperty,75);
    // Canvas::SetTop(myCheckBox, 75);

사용자 지정 연결된 속성

사용자 지정 결합속성을 정의하는 방법에 대한 코드 예제 및 결합속성을 사용하는 시나리오에 대한 자세한 내용은 사용자 지정 결합속성을 참조하세요.

결합속성 참조에 대한 특수 구문

결합속성 이름에 있는 점이 식별 패턴의 핵심 부분입니다. 때때로 구문이나 상황에서 점이 다른 의미를 갖는 것으로 취급하여 모호성이 생기는 경우가 있습니다. 예를 들어 점이 바인딩 경로에 대한 객체 모델 순회로 처리되기도 합니다. 이러한 모호성과 관련된 경우 대부분, 내부 점을 결합속성.의 소유자 속성 구분자로 구문 분석할 수 있도록 하는 결합속성 전용 특수 구문이 있습니다.

  • 애니메이션에 대한 대상 경로의 일부로 결합속성을 지정하려면, 결합속성 이름을 괄호("()")(예: "(Canvas.Left)")로 묶습니다. 자세한 내용은 속성 경로 구문을 참조하세요.

Warning

Windows 런타임 XAML 구현의 기존 제한점은 사용자 지정 연결 속성에 애니메이션 효과를 줄 수 없다는 것입니다.

  • 연결된 속성을 리소스 파일에서 x:Uid로의 리소스 참조를 위한 대상 속성으로 지정하려면 코드 스타일로 정규화된 using: 선언을 대괄호(“[]”) 안에 주입한 특수 구문을 사용하여 의도적인 범위 분할을 만듭니다. 예를 들어 <TextBlock x:Uid="Title" /> 요소가 있다고 가정할 경우 해당 인스턴스의 Canvas.Top 값을 대상으로 하는 리소스 파일의 리소스 키는 “Title.[using:Windows.UI.Xaml.Controls]Canvas.Top”입니다. 리소스 파일 및 XAML에 대한 자세한 내용은 빠른 시작: UI 리소스 번역을 참조하세요.