PropertyPath XAML 구문
PropertyPath 개체는 PropertyPath 형식을 값으로 사용하는 다양한 속성을 설정하기 위한 복잡한 인라인 XAML 구문을 지원합니다. 이 항목에서는 바인딩 및 애니메이션 구문에 적용되는 PropertyPath 구문에 대해 설명합니다.
이 항목에는 다음 단원이 포함되어 있습니다.
- PropertyPath 사용 대상
- 데이터 바인딩 시 개체의 PropertyPath
- 애니메이션 대상의 PropertyPath
- 코드에서의 PropertyPath
- 관련 항목
PropertyPath 사용 대상
PropertyPath는 여러 Windows Presentation Foundation (WPF) 기능에 사용되는 공통 개체입니다. 그러나 공통 PropertyPath를 사용하여 속성 경로 정보를 제공하더라도 이 개체의 사용 방법은 PropertyPath를 형식으로 사용하는 기능 영역마다 다르기 때문에 여기에서는 보다 유용하도록 기능별로 구문을 설명합니다.
기본적으로 WPF에서는 개체 데이터 소스의 속성을 이동하기 위한 개체 모델 경로 및 대상으로 지정된 애니메이션의 경로를 설명하는 데 PropertyPath를 사용합니다.
Setter.Property 같은 일부 스타일 및 템플릿 속성도 겉보기에는 PropertyPath와 비슷한 정규화된 속성 이름을 사용합니다. 그러나 이는 PropertyPath가 아니며 WPF XAML 프로세서에서 DependencyProperty의 형식 변환기와 함께 사용하는 정규화된 owner.property 문자열 형식입니다.
데이터 바인딩 시 개체의 PropertyPath
데이터 바인딩은 원하는 종속성 속성의 대상 값에 바인딩할 수 있는 WPF 기능입니다. 그러나 이러한 데이터 바인딩의 소스는 종속성 속성뿐 아니라 해당 데이터 공급자가 인식할 수 있는 모든 속성 형식일 수 있습니다. 속성 경로는 common language runtime (CLR) 개체와 해당 속성에서 바인딩 소스를 가져오는 데 사용되는 ObjectDataProvider에 주로 사용됩니다.
참고로 XML에 대한 데이터 바인딩에서는 Binding에 Path를 사용하지 않기 때문에 PropertyPath를 사용하지 않습니다. 대신, XPath를 사용하고 데이터의 XML Document Object Model (DOM)에 올바른 XPath 구문을 지정합니다. XPath는 문자열로도 지정되지만 여기에 문서화되지 않았습니다. 방법: XMLData Provider 및 XPath 쿼리를 사용하여 XML 데이터에 바인딩 를 참조하십시오.
데이터 바인딩에서 속성 경로를 사용할 때는 개별 속성 값을 바인딩 대상으로 지정하거나 목록 또는 컬렉션을 사용하는 속성을 바인딩 대상으로 지정할 수 있다는 점을 알아야 합니다. 컬렉션을 바인딩하는 경우, 예를 들어 컬렉션에 있는 데이터 항목 수에 따라 확장되는 ListBox를 바인딩하는 경우에는 속성 경로에서 개별 컬렉션 항목이 아니라 컬렉션 개체를 참조해야 합니다. 데이터 바인딩 엔진은 데이터 소스로 사용된 컬렉션을 바인딩 대상의 형식에 자동으로 일치시켜 ListBox에 항목 배열 채우기 등의 동작을 수행합니다.
직접 연결된 개체에서 데이터 컨텍스트를 나타내는 단일 속성
<Binding Path="propertyName" .../>
Path를 사용할 때 propertyName은 현재 DataContext에 포함된 속성의 이름이어야 합니다. 바인딩을 통해 소스를 업데이트할 경우 해당 속성이 읽기/쓰기 가능해야 하며 소스 개체가 변경 가능해야 합니다.
직접 연결된 개체에서 데이터 컨텍스트를 나타내는 단일 인덱서
<Binding Path="[key]" .../>
key는 사전이나 해시 테이블에 대한 형식화된 인덱스이거나, 배열의 정수 인덱스여야 합니다. 또한 키 값은 해당 키가 적용되는 속성에 직접 바인딩될 수 있는 형식이어야 합니다. 예를 들어 이 방법을 사용하여 문자열 키와 문자열 값을 포함하는 해시 테이블을 TextBox의 Text에 바인딩할 수 있습니다. 또는 키가 컬렉션이나 하위 인덱스를 가리키는 경우 이 구문을 사용하여 대상 컬렉션 속성에 바인딩할 수 있습니다. 이런 경우 이외에는 <Binding Path="[key].propertyName" .../> 같은 구문을 통해 특정 속성을 참조해야 합니다.
필요한 경우 인덱스 형식을 지정할 수 있습니다. 인덱싱된 속성 경로에 대해 이와 관련된 자세한 내용은 Binding.Path를 참조하십시오.
여러 속성(간접 속성 대상 지정)
<Binding Path="propertyName.propertyName2" .../>
propertyName은 현재 DataContext에 포함된 속성의 이름이어야 합니다. 경로 속성 propertyName 및 propertyName2는 서로 관련된 모든 속성이 될 수 있으며 여기서 propertyName2는 propertyName 값의 형식에 포함된 속성이어야 합니다.
연결되거나 형식이 정규화된 단일 속성
<object property="(ownerType.propertyName)" .../>
여기서 괄호는 PropertyPath의 이 속성을 부분 정규화를 통해 생성해야 함을 나타냅니다. XML 네임스페이스를 사용하여 적합한 매핑을 포함한 형식을 찾을 수 있습니다. ownerType은 각 어셈블리의 XmlnsDefinitionAttribute 선언을 통해 XAML 프로세서에서 액세스할 수 있는 형식을 검색합니다. 대부분의 응용 프로그램에는 https://schemas.microsoft.com/winfx/2006/xaml/presentation 네임스페이스에 기본 XML 네임스페이스가 매핑되기 때문에 일반적으로 사용자 지정 형식이나 XML 네임스페이스의 범위에 포함되지 않는 형식에 대해서만 접두사가 필요합니다. propertyName은 ownerType에 있는 속성의 이름이어야 합니다. 일반적으로 이 구문은 다음과 같은 경우 중 하나에 사용됩니다.
대상 형식이 지정되지 않은 스타일 또는 템플릿에 포함된 경로를 XAML로 지정한 경우. 스타일 또는 템플릿을 사용하지 않는 경우 속성은 형식이 아니라 인스턴스에 존재하기 때문에 정규화된 방식은 일반적으로 이와 같은 경우에만 유효합니다.
속성이 연결된 속성인 경우
정적 속성에 바인딩하는 경우.
Storyboard 대상으로 사용하는 경우 propertyName으로 지정하는 속성은 DependencyProperty이어야 합니다.
소스 이동(컬렉션 계층 구조에 바인딩)
<object Path="propertyName/propertyNameX" .../>
이 구문에서 /는 계층적 데이터 소스 개체 내에서 탐색하는 데 사용되며, /를 여러 개 사용하여 계층 구조 내에서 여러 단계를 이동할 수 있습니다. 소스 이동 시 현재 레코드 포인터 위치가 고려되는데, 현재 레코드 포인터 위치는 데이터와 해당 뷰의 UI를 동기화하여 결정됩니다. 계층적 데이터 소스 개체와의 바인딩 및 데이터 바인딩 시 현재 레코드 포인터의 개념에 대한 자세한 내용은 방법: 계층적 데이터에 마스터-세부 패턴 사용 또는 데이터 바인딩 개요를 참조하십시오.
참고 |
---|
이 구문은 겉보기에는 XPath와 비슷합니다.XML 데이터 소스에 바인딩하기 위한 실제 XPath 식은 Path 값으로 사용하는 대신 함께 사용할 수 없는 XPath 속성에 사용해야 합니다. |
컬렉션 뷰
명명된 컬렉션 뷰를 참조하려면 컬렉션 뷰 이름 앞에 해시 문자(#)를 추가합니다.
현재 레코드 포인터
마스터 세부 데이터 바인딩 시나리오나 컬렉션 보기의 현재 레코드 포인터를 참조하려면 경로 문자열을 슬래시(/)로 시작합니다. 슬래시 다음에 나오는 경로는 현재 레코드 포인터부터 이동합니다.
여러 인덱서
<object Path="[index1,index2...]" .../>
or
<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 값 형식 또는 기본 형식의 속성이어야 합니다.
propertyName2는 propertyName의 값인 개체에 포함된 종속성 속성의 이름이어야 합니다. 즉, propertyName2는 형식이 propertyName PropertyType에 포함된 종속성 속성이어야 합니다.
간접 애니메이션 대상 지정은 적용되는 스타일과 템플릿에 필요합니다. 애니메이션 대상을 지정하려면 대상 개체의 TargetName이 필요하며, 이 이름은 x:Name 또는 Name으로 설정해야 합니다. 템플릿과 스타일 요소도 이름을 가질 수 있지만 이러한 이름은 해당 스타일 및 템플릿의 이름 범위 내에서만 유효합니다. 템플릿 및 스타일이 응용 프로그램 태그와 이름 범위를 공유하는 경우, 스타일과 템플릿은 인스턴스 사이에 실제로 공유되어 중복 이름이 사용되므로 해당 이름이 고유할 수 없습니다. 따라서 애니메이션을 적용할 요소의 개별 속성이 스타일 또는 템플릿에 포함된 경우에는 스타일 템플릿에서 가져오지 않은 명명된 요소 인스턴스로 시작한 후 스타일 또는 템플릿의 시각적 트리에서 애니메이션을 적용할 속성으로 대상을 지정해야 합니다.
예를 들어 Panel의 Background 속성은 테마 템플릿에 포함된 완전한 Brush(실제로는 SolidColorBrush)입니다. Brush에 애니메이션을 적용하려면 각 Brush 형식에 대해 BrushAnimation이 하나씩 필요할 수 있는데, 이러한 형식은 없습니다. 따라서 이렇게 하는 대신 특정 Brush 형식의 속성에 애니메이션 효과를 적용합니다. 그러려면 SolidColorBrush에서 Color로 이동한 후 이 속성에 ColorAnimation을 적용해야 합니다. 이 예제에서 속성 경로는 Background.Color입니다.
연결된 속성
<animation Storyboard.TargetProperty="(ownerType.propertyName)" .../>
여기서 괄호는 PropertyPath의 이 속성을 부분 정규화를 통해 생성해야 함을 나타냅니다. XML 네임스페이스를 사용하여 형식을 찾을 수 있습니다. ownerType은 각 어셈블리의 XmlnsDefinitionAttribute 선언을 통해 XAML 프로세서에서 액세스할 수 있는 형식을 검색합니다. 대부분의 응용 프로그램에는 https://schemas.microsoft.com/winfx/2006/xaml/presentation 네임스페이스에 기본 XML 네임스페이스가 매핑되기 때문에 일반적으로 사용자 지정 형식이나 XML 네임스페이스의 범위에 포함되지 않는 형식에 대해서만 접두사가 필요합니다. propertyName은 ownerType에 있는 속성의 이름이어야 합니다. propertyName으로 지정한 속성은 DependencyProperty여야 합니다. 모든 WPF 연결 속성은 종속성 속성으로 구현되기 때문에 이러한 문제는 사용자 지정 연결 속성에만 해당됩니다.
인덱서
<animation Storyboard.TargetProperty="propertyName.propertyName2[index].propertyName3" .../>
대부분의 종속성 속성 또는 Freezable 형식은 인덱서를 지원하지 않습니다. 따라서 애니메이션 경로를 지정할 때 인덱서는 명명된 대상과 실제 애니메이션 속성의 체인을 시작하는 속성의 중간 위치에 사용됩니다. 이 구문에서는 propertyName2가 이에 해당합니다. 예를 들어 RenderTransform.Children[1].Angle 같은 속성 경로에서 중간 속성이 TransformGroup 같은 컬렉션인 경우 인덱서가 필요할 수 있습니다.
코드에서의 PropertyPath
PropertyPath를 생성하는 방법을 포함하여 PropertyPath 코드 사용법에 대한 자세한 내용은 PropertyPath의 참조 항목에 설명되어 있습니다.
일반적으로 PropertyPath는 두 가지 생성자를 사용하도록 디자인되었습니다. 하나는 바인딩 및 간단한 애니메이션에 사용할 수 있는 생성자이고 다른 하나는 복잡한 애니메이션에 사용할 수 있는 생성자입니다. PropertyPath(Object) 시그니처는 문자열인 개체를 바인딩할 때 사용하고, 개체가 DependencyProperty인 경우 단일 단계 애니메이션 경로를 지정할 때도 PropertyPath(Object) 시그니처를 사용합니다. PropertyPath(String, Object[]) 시그니처는 복잡한 애니메이션에 사용합니다. 이 두 번째 생성자는 첫 번째 매개 변수에 토큰 문자열을 사용하고, 토큰 문자열의 위치를 채우는 개체 배열을 사용하여 속성 경로 관계를 정의합니다.