PropertyPath XAML 구문

PropertyPath 개체에서는 다양한 속성을 설정하여 PropertyPath 형식을 값으로 사용할 수 있는 복잡한 인라인 XAML 구문을 지원합니다. 이 토픽에서는 바인딩 및 애니메이션 구문에 적용되는 PropertyPath 구문을 설명합니다.

PropertyPath를 사용하는 경우

PropertyPath는 여러 WPF(Windows Presentation Foundation) 기능에 사용되는 공통 개체입니다. 속성 경로 정보를 전달하는 데는 공통 PropertyPath를 사용하지만 PropertyPath가 형식으로 사용되는 각 기능 영역의 사용법은 다양합니다. 따라서 구문은 기능별로 설명하는 것이 좋습니다.

기본적으로 WPF는 PropertyPath를 사용하여 개체 데이터 소스의 속성을 통과할 수 있도록 개체-모델 경로를 설명하고 대상 애니메이션의 대상 경로를 설명합니다.

일부 스타일과 템플릿 속성(예: Setter.Property)은 PropertyPath와 표면적으로 유사한 정규화된 속성 이름을 사용합니다. 하지만 이는 실제 PropertyPath가 아닙니다. 대신 DependencyProperty의 형식 변환기와 결합된 WPF XAML 프로세서를 통해 사용할 수 있는 정규화된 owner.property 문자열 형식 사용량입니다.

데이터 바인딩의 개체에 대한 PropertyPath

데이터 바인딩은 WPF 기능이며 이를 통해 종속성 속성의 대상 값에 바인딩할 수 있습니다. 하지만 해당 데이터 바인딩의 소스는 종속성 속성이어야 하며 적용 가능한 데이터 공급자가 인식하는 모든 속성 형식일 수 있습니다. 속성 경로는 특히 CLR(공통 언어 런타임) 개체와 해당 속성에서 바인딩 소스를 가져오는 데 사용되는 ObjectDataProvider에 사용됩니다.

XML에 대한 데이터 바인딩에서는 PropertyPathBinding에서 Path를 사용하지 않으므로 이를 사용하지 않습니다. 대신 XPath를 사용하고 데이터의 XML DOM(문서 개체 모델)에 유효한 XPath 구문을 지정합니다. XPath는 문자열로도 지정되지만 여기서는 설명하지 않습니다. XMLDataProvider 및 XPath 쿼리를 사용하여 XML 데이터에 바인딩을 참조하세요.

데이터 바인딩의 속성 경로를 이해하는 열쇠는 개별 속성 값에 대한 바인딩을 대상으로 지정할 수 있거나 목록이나 컬렉션을 사용하는 대상 속성에 바인딩할 수 있다는 점입니다. 컬렉션에 있는 데이터 항목 수에 따라 확장되는 ListBox를 바인딩하는 것과 같이 컬렉션을 바인딩하는 경우 속성 경로는 개별 컬렉션 항목이 아닌 컬렉션 개체를 참조해야 합니다. 데이터 바인딩 엔진은 자동으로 바인딩 대상의 형식에 대한 데이터 소스로 사용되는 컬렉션과 일치하므로 ListBox를 항목 배열로 채우기와 같은 동작이 수행됩니다.

데이터 컨텍스트로서 직접 실행 개체에 대한 단일 속성

<Binding Path="propertyName" ... />

propertyNamePath 사용량에 대한 현재 DataContext에 있는 속성의 이름으로 확인되어야 합니다. 바인딩이 소스를 업데이트하면 해당 속성은 읽기/쓰기여야 하고 소스 개체는 변경 가능해야 합니다.

데이터 컨텍스트로서 직접 실행 개체에 대한 단일 인덱서

<Binding Path="[key]" ... />

key는 사전 및 해시 테이블에 대한 형식화된 인덱스이거나 배열의 정수 인덱스여야 합니다. 또한 키 값은 키 값이 적용되는 속성에 직접 바인딩할 수 있는 형식이어야 합니다. 예를 들어 문자열 키와 문자열 값이 포함된 해시 테이블을 이 방식으로 사용하여 TextBox에 대한 텍스트에 바인딩할 수 있습니다. 또는 키가 컬렉션이나 하위 인덱스를 가리키는 경우 이 구문을 사용하여 대상 컬렉션 속성에 바인딩할 수 있습니다. 이외의 경우에는 <Binding Path="[key].propertyName" .../>과 같은 구문을 통해 특정 속성을 참조해야 합니다.

필요한 경우 인덱스의 형식을 지정할 수 있습니다. 인덱싱된 속성 경로 측면에 대한 자세한 내용은 Binding.Path를 참조하세요.

다중 속성(간접 속성 대상 지정)

<Binding Path="propertyName.propertyName2" ... />

propertyName은 현재 DataContext인 속성의 이름으로 확인되어야 합니다. 경로 속성 propertyNamepropertyName2는 관계에 있는 속성일 수 있습니다. 여기서 propertyName2propertyName 값인 형식에 있는 속성입니다.

연결된 또는 정규화된 형식의 단일 속성

<object property="(ownerType.propertyName)" ... />

괄호는 부분 한정자를 통해 PropertyPath의 이 속성을 생성해야 함을 나타냅니다. XML 네임스페이스를 사용하여 적절한 매핑이 있는 형식을 찾을 수 있습니다. ownerType은 XAML 프로세서에서 액세스할 수 있는 형식을 각 어셈블리의 XmlnsDefinitionAttribute 선언을 통해 검색합니다. 대부분 애플리케이션에서는 기본 XML 네임스페이스가 http://schemas.microsoft.com/winfx/2006/xaml/presentation 네임스페이스에 매핑되므로 접두사는 대개 사용자 지정 형식 또는 해당 네임스페이스 외부의 형식에만 필요합니다. propertyNameownerType에 있는 속성의 이름으로 확인되어야 합니다. 일반적으로 이 구문은 다음 경우 중 하나에 사용됩니다.

  • 경로는 지정된 대상 형식이 없는 스타일이나 템플릿인 XAML에 지정됩니다. 스타일이 아니고 템플릿이 아닌 경우에 속성은 형식이 아닌 인스턴스에 있으므로 일반적으로 이를 제외한 다른 경우에는 정규화된 사용이 적절하지 않습니다.

  • 속성은 연결된 속성입니다.

  • 정적 속성이 바인딩 중입니다.

스토리보드 대상으로 사용하려면 propertyName으로 지정된 속성은 DependencyProperty여야 합니다.

소스 순회(컬렉션 계층 구조에 바인딩)

<object Path="propertyName/propertyNameX" ... />

이 구문의 /는 계층적 데이터 소스 개체 내에서 탐색하는 데 사용되고 연속 / 문자가 있는 계층 구조에 대한 여러 단계는 지원되지 않습니다. 소스 순회는 데이터를 뷰의 UI와 동기화할 때 결정되는 현재 레코드 포인터 위치를 처리합니다. 계층적 데이터 소스 개체를 사용한 바인딩 및 데이터 바인딩의 현재 레코드 포인터 개념에 대한 자세한 내용은 계층적 데이터에 마스터-세부 패턴 사용 또는 데이터 바인딩 개요를 참조하세요.

참고

표면적으로 이 구문은 XPath와 비슷합니다. XML 데이터 원본에 대한 바인딩의 실제 XPath 식은 Path 값으로 사용되지 않으며 대신 상호 배타적인 XPath 속성에 사용되어야 합니다.

컬렉션 뷰

명명된 컬렉션 뷰를 참조하려면 해시 문자(#)를 컬렉션 뷰 이름에 접두사로 추가합니다.

현재 레코드 포인터

컬렉션 뷰 또는 마스터 세부 데이터 바인딩 시나리오에 대한 현재 레코드 포인터를 참조하려면 경로 문자열을 슬래시(/)로 시작합니다. 슬래시를 통과하는 모든 경로는 현재 레코드 포인터부터 이동합니다.

여러 인덱서

<object Path="[index1,index2...]" ... />

또는

<object Path="propertyName[index,index2...]" ... />

특정 개체가 여러 인덱서를 지원할 경우 이러한 인덱서는 배열 참조 구문처럼 순서대로 지정될 수 있습니다. 해당 개체는 현재 컨텍스트이거나 여러 인덱스 개체를 포함하는 속성의 값일 수 있습니다.

기본적으로 인덱서 값은 기본 개체의 특징을 사용해서 형식화됩니다. 필요한 경우 인덱스의 형식을 지정할 수 있습니다. 인덱서 입력 방법에 대한 자세한 내용은 Binding.Path를 참조하세요.

구문 혼합

위에 표시되는 각 구문은 섞여 있을 수 있습니다. 예를 들어 다음 예제에서는 SolidColorBrush 개체의 픽셀 그리드 배열이 포함된 ColorGrid 속성의 특정 x,y에 있는 색에 대한 속성 경로를 만듭니다.

<Rectangle Fill="{Binding ColorGrid[20,30].SolidColorBrushResult}" ... />

속성 경로 문자열에 대한 이스케이프

특정 비즈니스 개체의 경우 제대로 구문 분석되려면 속성 경로 문자열에 이스케이프 시퀀스가 있어야 하는 경우가 있습니다. 이스케이프해야 하는 경우는 드뭅니다. 대부분의 이러한 문자에는 일반적으로 비즈니스 개체를 정의하는 데 사용되는 언어에 비슷한 명명 상호 작용 문제가 있기 때문입니다.

  • 인덱서([ ]) 안의 캐럿 문자(^)는 다음 문자를 이스케이프합니다.

  • XML 언어 정의와 관련된 특정 문자를 이스케이프(XML 엔터티 사용)해야 합니다. "&" 문자를 이스케이프하려면 &를 사용합니다. ">" 끝 태그를 이스케이프하려면 >를 사용합니다.

  • 태그 확장을 처리하기 위해 WPF XAML 구문 분석기 동작과 관련된 특정 문자를 이스케이프해야 합니다(백슬래시 \ 사용).

    • 백슬래시(\)는 그 자체로 이스케이프 문자입니다.

    • 등호(=)는 속성 값에서 속성 이름을 구분합니다.

    • 쉼표(,)는 속성을 구분합니다.

    • 오른쪽 중괄호(})는 태그 확장의 끝입니다.

참고

기술적으로 이러한 이스케이프는 스토리보드 속성 경로에도 적용되지만 대개 기존 WPF 개체에 대한 개체 모델을 통과하므로 이스케이프가 필요하지 않습니다.

애니메이션 대상에 대한 PropertyPath

애니메이션의 대상 속성은 Freezable 또는 기본 형식을 사용하는 종속성 속성이어야 합니다. 하지만 형식의 대상 속성 및 최종 애니메이션 효과가 적용된 속성은 서로 다른 개체에 있을 수 있습니다. 애니메이션에 대한 속성 경로는 속성 값에서 개체 속성 관계를 통과하는 방식으로 명명된 애니메이션 대상 개체의 속성과 의도한 대상 애니메이션 속성 간 연결을 정의하는 데 사용됩니다.

애니메이션에 대한 일반 개체 속성 고려 사항

일반적인 애니메이션 개념에 대한 자세한 내용은 Storyboard 개요애니메이션 개요를 참조하세요.

애니메이션 효과가 적용되는 값 형식이나 속성은 Freezable 형식이거나 기본 형식이어야 합니다. 경로를 시작하는 속성은 지정된 TargetName 형식에 있는 종속성 속성의 이름으로 확인되어야 합니다.

이미 고정된 Freezable 애니메이션 효과를 복제할 수 있으려면 TargetName에서 지정한 개체가 FrameworkElement 또는 FrameworkContentElement 파생 클래스여야 합니다.

대상 개체에 대한 단일 속성

<animation Storyboard.TargetProperty="propertyName" ... />

propertyName은 지정된 TargetName 형식에 있는 종속성 속성의 이름으로 확인되어야 합니다.

간접 속성 대상 지정

<animation Storyboard.TargetProperty="propertyName.propertyName2" ... />

propertyName은 지정된 TargetName 형식에 있는 Freezable 값 형식이나 기본 형식인 속성이어야 합니다.

propertyName2propertyName 값인 개체에 있는 종속성 속성의 이름이어야 합니다. 즉, propertyName2propertyNamePropertyType인 형식에 대한 종속성 속성으로 있어야 합니다.

적용된 스타일 및 템플릿 때문에 애니메이션의 간접 대상 지정이 필요합니다. 애니메이션을 대상화하려면 대상 개체에 TargetName이 필요하며 해당 이름은 x:Name 또는 Name에서 설정됩니다. 템플릿 및 스타일 요소에 이름이 있을 수 있지만 해당 이름은 스타일 및 템플릿의 네임스페이스 내에서만 유효합니다. (템플릿 및 스타일이 애플리케이션 태그와 이름 범위를 공유한 경우 이름은 고유할 수 없습니다. 스타일과 템플릿은 문자 그대로 인스턴스 간에 공유되며 중복된 이름을 영속합니다.) 따라서 애니메이션 효과를 줄 수 있는 요소의 개별 속성이 스타일 또는 템플릿에서 온 경우 스타일 템플릿이 아닌 명명된 요소 인스턴스를 시작한 다음, 스타일 또는 템플릿 시각적 트리를 대상으로 지정하여 애니메이션 효과를 주려는 속성에 도달해야 합니다.

예를 들어 PanelBackground 속성은 테마 템플릿에서 제공하는 완전한 Brush(실제로는 SolidColorBrush)입니다. Brush에 완전히 애니메이션 효과를 주려면 BrushAnimation(모든 Brush 형식 중 하나일 수 있음)이 있어야 하지만 이런 형식은 없습니다. 대신에 Brush에 애니메이션 효과를 주려면 특정 Brush 형식의 속성에 애니메이션 효과를 줍니다. ColorAnimation을 적용하려면 SolidColorBrush에서 해당 Color를 가져와야 합니다. 이 예제의 속성 경로는 Background.Color입니다.

연결된 속성

<animation Storyboard.TargetProperty="(ownerType.propertyName)" ... />

괄호는 부분 한정자를 통해 PropertyPath의 이 속성을 생성해야 함을 나타냅니다. XML 네임스페이스를 사용하여 형식을 찾을 수 있습니다. ownerType은 XAML 프로세서에서 액세스할 수 있는 형식을 각 어셈블리의 XmlnsDefinitionAttribute 선언을 통해 검색합니다. 대부분 애플리케이션에서는 기본 XML 네임스페이스가 http://schemas.microsoft.com/winfx/2006/xaml/presentation 네임스페이스에 매핑되므로 접두사는 대개 사용자 지정 형식 또는 해당 네임스페이스 외부의 형식에만 필요합니다. propertyNameownerType에 있는 속성의 이름으로 확인되어야 합니다. propertyName으로 지정된 속성은 DependencyProperty이어야 합니다. (모든 WPF 연결된 속성은 종속성 속성으로 구현되므로 이 문제는 사용자 지정 연결된 속성에만 관련됩니다.)

인덱서

<animation Storyboard.TargetProperty="propertyName.propertyName2[index].propertyName3" ... />

대부분 종속성 속성이나 Freezable 형식에서는 인덱서를 지원하지 않습니다. 따라서 애니메이션 경로에서 인덱서는 명명된 대상에서 체인을 시작하는 속성과 최종 애니메이션 효과가 적용된 속성 사이의 중간 위치에만 사용됩니다. 제공된 구문에서 인덱서는 propertyName2입니다. 예를 들어 중간 속성이 RenderTransform.Children[1].Angle과 같은 속성 경로에 있는 컬렉션(예: TransformGroup)인 경우 인덱서를 사용해야 할 수 있습니다.

코드의 PropertyPath

PropertyPath 생성 방법이 포함된 PropertyPath의 코드 사용량은 PropertyPath의 참조 토픽에서 설명됩니다.

일반적으로 PropertyPath는 바인딩 사용 및 가장 간단한 애니메이션 사용을 위한 생성자와 복잡한 애니메이션 사용을 위한 생성자 등 다른 생성자 두 개를 사용하도록 설계되어 있습니다. 바인딩 사용에 PropertyPath(Object) 서명을 사용하며 여기서 개체는 문자열입니다. 1단계 애니메이션 경로에 PropertyPath(Object) 서명을 사용하며 여기서 개체는 DependencyProperty입니다. 복잡한 애니메이션에 PropertyPath(String, Object[]) 서명을 사용합니다. 후자의 생성자는 첫 번째 매개 변수에 토큰 문자열을 사용하고 속성 경로 관계를 정의하기 위해 토큰 문자열의 위치를 채우는 개체 배열을 사용합니다.

참고 항목