바인딩 소스 개요

데이터 바인딩에서 바인딩 소스 개체는 데이터를 가져오는 개체를 의미합니다. 이 항목에서는 바인딩 소스로 사용할 수 있는 개체 형식에 대해 설명합니다.

바인딩 소스 형식

WPF(Windows Presentation Foundation) 데이터 바인딩은 다음 바인딩 소스 형식을 지원합니다.

바인딩 소스 설명
CLR(공용 언어 런타임) 개체 모든 CLR(공용 언어 런타임) 개체의 공용 속성, 하위 속성 및 인덱서에 바인딩할 수 있습니다. 바인딩 엔진은 CLR 리플렉션을 사용하여 속성의 값을 가져옵니다. 또는 ICustomTypeDescriptor를 구현하거나 등록된 TypeDescriptionProvider가 있는 개체도 바인딩 엔진과 함께 사용됩니다.

바인딩 소스로 사용할 수 있는 클래스를 구현하는 방법은 이 항목 뒷부분의 바인딩 소스에 대한 클래스 구현을 참조하세요.
동적 개체 IDynamicMetaObjectProvider 인터페이스를 구현하는 개체의 사용 가능한 속성 및 인덱서에 바인딩할 수 있습니다. 코드의 멤버에 액세스할 수 있는 경우 바인딩할 수 있습니다. 예를 들어 동적 개체를 사용하여 someObject.AProperty를 통해 코드의 멤버에 액세스할 수 있는 경우 바인딩 경로를 AProperty로 설정하여 바인딩할 수 있습니다.
ADO.NET 개체 DataTable과 같은 ADO.NET 개체에 바인딩할 수 있습니다. ADO.NET DataView는 바인딩 엔진이 수신 대기하는 변경 알림을 제공하는 IBindingList 인터페이스를 구현합니다.
XML 개체 XmlNode, XmlDocument 또는 XmlElement에서 XPath 쿼리에 바인딩하고 해당 쿼리를 실행할 수 있습니다. 마크업의 바인딩 소스인 XML 데이터에 액세스하는 편리한 방법은 XmlDataProvider 개체를 사용하는 것입니다. 자세한 내용은 XMLDataProvider 및 XPath 쿼리를 사용하여 XML 데이터에 바인딩을 참조하세요.

XElement 또는 XDocument에 바인딩하거나 LINQ to XML을 사용하여 이러한 형식의 개체에서 실행되는 쿼리 결과에 바인딩할 수도 있습니다. LINQ to XML을 사용하여 마크업의 바인딩 소스인 XML 데이터에 액세스하는 편리한 방법은 ObjectDataProvider 개체를 사용하는 것입니다. 자세한 내용은 XDocument, XElement 또는 LINQ for XML 쿼리 결과에 바인딩을 참조하세요.
DependencyObject 개체입니다. 모든 DependencyObject의 종속성 속성에 바인딩할 수 있습니다. 예제는 두 컨트롤의 속성 바인딩을 참조하세요.

바인딩 소스에 대한 클래스 구현

고유한 바인딩 소스를 만들 수 있습니다. 이 섹션에서는 바인딩 소스로 사용할 클래스를 구현하는 경우 알아야 할 내용을 설명합니다.

변경 알림 제공

OneWay 또는 TwoWay 바인딩을 사용하는 경우(바인딩 소스 속성이 동적으로 변경될 때 UI가 업데이트되도록 하기 위해) 적절한 속성 변경 알림 메커니즘을 구현해야 합니다. 권장되는 메커니즘은 CLR 또는 동적 클래스가 INotifyPropertyChanged 인터페이스를 구현하는 것입니다. 자세한 내용은 속성 변경 알림 구현을 참조하세요.

INotifyPropertyChanged를 구현하지 않는 CLR 개체를 만드는 경우 바인딩에 사용된 데이터가 최신 상태로 유지되도록 고유한 알림 시스템을 설정해야 합니다. 변경 알림의 각 속성에 대해 PropertyChanged 패턴을 지원하여 변경 알림을 제공할 수 있습니다. 이 패턴을 지원하려면 각 속성에 대해 PropertyNameChanged 이벤트를 정의합니다. 여기서 PropertyName은 속성의 이름입니다. 속성이 변경될 때마다 이 이벤트를 발생시킵니다.

바인딩 소스가 이러한 알림 메커니즘 중 하나를 구현하는 경우 대상 업데이트가 자동으로 수행됩니다. 어떤 이유로든 바인딩 소스에서 적절한 속성 변경 알림을 제공하지 않는 경우 UpdateTarget 메서드를 사용하여 대상 속성을 명시적으로 업데이트할 수 있습니다.

기타 특성

다음은 고려해야 할 기타 중요 사항의 목록입니다.

  • XAML에서 개체를 만들려는 경우 클래스에 매개 변수가 없는 생성자가 있어야 합니다. C#과 같은 일부 .NET 언어에서는 매개 변수가 없는 생성자가 자동으로 만들어질 수 있습니다.

  • 바인딩의 바인딩 소스 속성으로 사용하는 속성은 클래스의 공용 속성이어야 합니다. 명시적으로 정의된 인터페이스 속성은 바인딩 용도로 액세스할 수 없으며, 기본 구현이 없는 보호, 전용, 내부 또는 가상 속성이 될 수 없습니다.

  • 공용 필드에 바인딩할 수 없습니다.

  • 클래스에서 선언된 속성의 형식은 바인딩에 전달되는 형식입니다. 그러나 궁극적으로 바인딩에서 사용되는 형식은 바인딩 소스 속성의 형식이 아니라 바인딩 대상 속성의 형식에 따라 달라집니다. 형식이 다른 경우 사용자 지정 속성이 처음 바인딩에 전달되는 방법을 처리하는 변환기를 작성하는 것이 좋습니다. 자세한 내용은 IValueConverter를 참조하세요.

전체 개체를 바인딩 소스로 사용

전체 개체를 바인딩 소스로 사용할 수 있습니다. Source 또는 DataContext 속성을 사용하여 바인딩 소스를 지정한 다음, 빈 바인딩 선언({Binding})을 제공할 수 있습니다. 이 방법이 유용한 시나리오의 예로는 문자열 형식 개체에 대한 바인딩, 관심 있는 속성이 여러 개 포함된 개체에 대한 바인딩 또는 컬렉션 개체에 대한 바인딩이 있습니다. 전체 컬렉션 개체에 대한 바인딩의 예제는 계층적 데이터에 마스터-세부 패턴 사용을 참조하세요.

바인딩된 대상 속성에서 데이터가 의미를 가지려면 사용자 지정 논리를 적용해야 할 수 있습니다. 사용자 지정 논리는 사용자 지정 변환기(기본 형식 변환이 없는 경우) 또는 DataTemplate 형식일 수 있습니다. 변환기에 대한 자세한 내용은 데이터 바인딩 개요의 데이터 변환 섹션을 참조하세요. 데이터 템플릿에 대한 자세한 내용은 데이터 템플릿 개요를 참조하세요.

컬렉션 개체를 바인딩 소스로 사용

바인딩 소스로 사용하려는 개체가 사용자 지정 개체의 컬렉션인 경우가 종종 있습니다. 각 개체는 반복되는 바인딩의 단일 인스턴스에 대한 소스로 사용됩니다. 예를 들어 CustomerOrder 개체로 구성된 CustomerOrders 컬렉션이 있고, 애플리케이션이 컬렉션에 대해 주문 수와 각 주문에 포함된 데이터를 반복적으로 확인할 수 있습니다.

IEnumerable 인터페이스를 구현하는 컬렉션을 열거할 수 있습니다. 그러나 컬렉션에서 삽입 또는 삭제가 발생할 때마다 UI가 자동으로 업데이트되도록 동적 바인딩을 설정하려면 컬렉션이 INotifyCollectionChanged 인터페이스를 구현해야 합니다. 이 인터페이스는 기본 컬렉션이 변경될 때마다 발생해야 하는 이벤트를 노출합니다.

ObservableCollection<T> 클래스는 INotifyCollectionChanged 인터페이스를 노출하는 데이터 수집의 기본 구현입니다. 컬렉션 내의 개별 데이터 개체는 이전 섹션에 설명된 요구 사항을 충족해야 합니다. 예제는 ObservableCollection 만들기 및 바인딩을 참조하세요. 고유한 컬렉션을 구현하기 전에 ObservableCollection<T>을 사용하거나 List<T>, Collection<T>BindingList<T>와 같은 기존 컬렉션 클래스 중 하나를 사용하는 것이 좋습니다.

WPF는 컬렉션에 직접 바인딩되지 않습니다. 바인딩 소스로 컬렉션을 지정하면 WPF가 실제로 컬렉션의 기본 뷰에 바인딩됩니다. 기본 뷰에 대한 자세한 내용은 데이터 바인딩 개요를 참조하세요.

고급 시나리오에서 자체 컬렉션을 구현하려는 경우 IList 인터페이스 사용을 고려하세요. IList는 인덱스를 통해 개별적으로 액세스하여 성능을 개선할 수 있는 개체의 비제네릭 컬렉션을 제공합니다.

데이터 바인딩의 사용 권한 요구 사항

데이터 바인딩 시 애플리케이션의 신뢰 수준을 고려해야 합니다. 다음 표에는 완전 신뢰 또는 부분 신뢰 상태에서 실행되는 애플리케이션에 바인딩할 수 있는 속성 형식이 요약되어 있습니다.

속성 형식

(모든 액세스 한정자)
동적 개체 속성 동적 개체 속성 CLR 속성 CLR 속성 종속성 속성 종속성 속성
신뢰 수준 완전 신뢰 부분 신뢰 완전 신뢰 부분 신뢰 완전 신뢰 부분 신뢰
Public 클래스
Public이 아닌 클래스 없음 없음

이 표에서는 데이터 바인딩의 사용 권한 요구 사항에 대한 다음 중요 사항을 설명합니다.

  • CLR 속성의 경우 바인딩 엔진이 리플렉션을 사용하여 바인딩 소스 속성에 액세스할 수 있는 한 데이터 바인딩이 작동됩니다. 그렇지 않은 경우 바인딩 엔진이 속성을 찾을 수 없다는 경고를 생성하고 대체 값 또는 기본값(사용 가능한 경우)을 사용합니다.

  • 컴파일 타임 또는 런타임에 정의된 동적 개체의 속성에 바인딩할 수 있습니다.

  • 항상 종속성 속성에 바인딩할 수 있습니다.

XML 바인딩에 대한 사용 권한 요구 사항은 비슷합니다. 부분 신뢰 샌드박스에서 지정된 데이터에 대한 액세스 권한이 없는 경우 XmlDataProvider가 실패합니다.

익명 형식 개체는 내부 개체입니다. 완전 신뢰 상태에서 실행 중인 경우에만 익명 형식의 속성에 바인딩할 수 있습니다. 익명 형식에 대한 자세한 내용은 익명 형식(C# 프로그래밍 가이드) 또는 익명 형식(Visual Basic)(Visual Basic)을 참조하세요.

부분 신뢰 보안에 대한 자세한 내용은 WPF 부분 신뢰 보안을 참조하세요.

참고 항목