바인딩 원본이란? (WPF .NET)
데이터 바인딩에서 바인딩 소스 개체는 데이터를 가져오는 개체를 의미합니다. 이 문서에서는 .NET CLR 개체, XML, DependencyObject 개체 등 바인딩 소스로 사용할 수 있는 개체의 형식에 대해 설명합니다.
바인딩 소스 형식
WPF(Windows Presentation Foundation) 데이터 바인딩은 다음 바인딩 소스 형식을 지원합니다.
.NET CLR(공용 언어 런타임) 개체
모든 CLR(공용 언어 런타임) 개체의 공용 속성, 하위 속성 및 인덱서에 바인딩할 수 있습니다. 바인딩 엔진은 CLR 리플렉션을 사용하여 속성의 값을 가져옵니다. ICustomTypeDescriptor를 구현하거나 등록된 TypeDescriptionProvider가 있는 개체도 바인딩 엔진과 함께 사용됩니다.
바인딩 소스로 사용할 수 있는 클래스를 구현하는 방법에 대한 자세한 내용은 이 문서 뒷부분의 개체에서 바인딩 소스 구현을 참조하세요.
동적 개체
IDynamicMetaObjectProvider 인터페이스를 구현하는 개체의 사용 가능한 속성 및 인덱서에 바인딩할 수 있습니다. 코드의 멤버에 액세스할 수 있는 경우 바인딩할 수 있습니다. 예를 들어 동적 개체를 사용하여
SomeObject.AProperty
를 통해 코드의 멤버에 액세스할 수 있는 경우 바인딩 경로를AProperty
로 설정하여 바인딩할 수 있습니다.ADO.NET 개체
DataTable과 같은 ADO.NET 개체에 바인딩할 수 있습니다. ADO.NET DataView는 바인딩 엔진이 수신 대기하는 변경 알림을 제공하는 IBindingList 인터페이스를 구현합니다.
XML 개체
XPath
, XmlNode 또는 XmlDocument에서 XmlElement 쿼리에 바인딩하고 해당 쿼리를 실행할 수 있습니다. 태그의 바인딩 소스인 XML 데이터에 액세스하는 편리한 방법은 XmlDataProvider 개체를 사용하는 것입니다. 자세한 내용은 XMLDataProvider 및 XPath 쿼리를 사용하여 XML 데이터에 바인딩(.NET Framework)을 참조하세요.XElement 또는 XDocument에 바인딩하거나 LINQ to XML을 사용하여 이러한 형식의 개체에서 실행되는 쿼리 결과에 바인딩할 수도 있습니다. LINQ to XML을 사용하여 태그의 바인딩 소스인 XML 데이터에 액세스하는 편리한 방법은 ObjectDataProvider 개체를 사용하는 것입니다. 자세한 내용은 XDocument, XElement 또는 LINQ for XML 쿼리 결과에 바인딩(.NET Framework)을 참조하세요.
-
모든 DependencyObject의 종속성 속성에 바인딩할 수 있습니다. 예제는 두 컨트롤의 속성 바인딩(.NET Framework)을 참조하세요.
개체에서 바인딩 소스 구현
CLR 개체는 바인딩 소스가 될 수 있습니다. 바인딩 소스로 사용할 클래스를 구현할 때 유의해야 할 몇 가지 사항이 있습니다.
변경 알림 제공
OneWay 또는 TwoWay 바인딩을 사용하는 경우 적절한 "속성 변경됨" 알림 메커니즘을 구현하세요. 권장되는 메커니즘은 CLR 또는 동적 클래스가 INotifyPropertyChanged 인터페이스를 구현하는 것입니다. 자세한 내용은 방법: 속성 변경 알림 구현(.NET Framework)을 참조하세요.
구독자에게 속성 변경을 알리는 방법에는 다음 두 가지가 있습니다.
INotifyPropertyChanged 인터페이스를 구현합니다.
알림에 권장되는 메커니즘입니다. INotifyPropertyChanged는 바인딩 시스템이 따르는 PropertyChanged 이벤트를 제공합니다. 이 이벤트를 발생시키고 변경된 속성의 이름을 제공하여 바인딩 대상에 변경 사항을 알립니다.
PropertyChanged
패턴을 구현합니다.바인딩 대상에 변경되었음을 알려야 하는 각 속성에는 해당
PropertyNameChanged
이벤트가 있습니다. 여기서PropertyName
은 속성의 이름입니다. 속성이 변경될 때마다 이 이벤트를 발생시킵니다.
바인딩 소스가 이러한 알림 메커니즘 중 하나를 구현하는 경우 대상 업데이트가 자동으로 수행됩니다. 어떤 이유로든 바인딩 소스에서 적절한 속성 변경 알림을 제공하지 않는 경우 UpdateTarget 메서드를 사용하여 대상 속성을 명시적으로 업데이트할 수 있습니다.
기타 특성
다음은 고려해야 할 기타 중요 사항의 목록입니다.
바인딩 소스 역할을 하는 데이터 개체는 매개 변수가 없는 생성자가 있는 경우 XAML에서 리소스로 선언할 수 있습니다. 그렇지 않으면 코드에서 데이터 개체를 만들어 XAML 개체 트리의 데이터 컨텍스트에 직접 할당하거나 바인딩의 바인딩 소스로 할당해야 합니다.
바인딩 소스 속성으로 사용하는 속성은 클래스의 public 속성이어야 합니다. 명시적으로 정의된 인터페이스 속성은 바인딩 용도로 액세스할 수 없으며, 기본 구현이 없는 protected, private, internal 또는 virtual 속성이 될 수 없습니다.
public 필드에는 바인딩할 수 없습니다.
클래스에서 선언된 속성의 형식은 바인딩에 전달되는 형식입니다. 그러나 궁극적으로 바인딩에서 사용되는 형식은 바인딩 소스 속성의 형식이 아니라 바인딩 대상 속성의 형식에 따라 달라집니다. 형식이 다른 경우 사용자 지정 속성이 처음 바인딩에 전달되는 방법을 처리하는 변환기를 작성하는 것이 좋습니다. 자세한 내용은 IValueConverter를 참조하세요.
바인딩 소스로서의 전체 개체
전체 개체를 바인딩 소스로 사용할 수 있습니다.
Source 또는 DataContext 속성을 사용하여 바인딩 소스를 지정한 다음 빈 바인딩 선언({Binding}
)을 제공하세요. 이 방법이 유용한 시나리오의 예로는 문자열 형식 개체에 대한 바인딩, 관심 있는 속성이 여러 개 포함된 개체에 대한 바인딩 또는 컬렉션 개체에 대한 바인딩이 있습니다. 전체 컬렉션 개체에 대한 바인딩의 예제는 방법: 계층적 데이터에 마스터-세부 패턴 사용(.NET Framework)을 참조하세요.
바인딩된 대상 속성에서 데이터가 의미를 가지려면 사용자 지정 논리를 적용해야 할 수 있습니다. 사용자 지정 논리는 사용자 지정 변환기 또는 DataTemplate 양식일 수 있습니다. 변환기에 관한 자세한 내용은 데이터 변환을 참조하세요. 데이터 템플릿에 관한 자세한 내용은 데이터 템플릿 개요(.NET Framework)를 참조하세요.
바인딩 소스로서의 컬렉션 개체
바인딩 소스로 사용하려는 개체가 사용자 지정 개체의 컬렉션인 경우가 종종 있습니다. 각 개체는 반복되는 바인딩의 단일 인스턴스에 대한 소스로 사용됩니다. 예를 들어 CustomerOrders
개체로 구성된 CustomerOrder
컬렉션이 있고, 애플리케이션이 컬렉션에 대해 주문 수와 각 주문에 포함된 데이터를 반복적으로 확인할 수 있습니다.
IEnumerable 인터페이스를 구현하는 컬렉션을 열거할 수 있습니다. 그러나 컬렉션에서 삽입 또는 삭제가 발생할 때마다 UI가 자동으로 업데이트되도록 동적 바인딩을 설정하려면 컬렉션이 INotifyCollectionChanged 인터페이스를 구현해야 합니다. 이 인터페이스는 기본 컬렉션이 변경될 때마다 발생해야 하는 이벤트를 노출합니다.
ObservableCollection<T> 클래스는 INotifyCollectionChanged 인터페이스를 노출하는 데이터 수집의 기본 구현입니다. 컬렉션 내의 개별 데이터 개체는 이전 섹션에 설명된 요구 사항을 충족해야 합니다. 예제는 ObservableCollection을 만들고 바인딩하는 방법(.NET Framework)을 참조하세요. 자체 컬렉션을 구현하기 전에 ObservableCollection<T>을 사용하거나 List<T>, Collection<T> 및 BindingList<T>와 같은 기존 컬렉션 클래스 중 하나를 사용하는 것이 좋습니다.
컬렉션을 바인딩 소스로 지정하면 WPF는 컬렉션에 직접 바인딩되지 않습니다. 대신 WPF는 컬렉션의 기본 보기에 바인딩됩니다. 기본 보기에 대한 자세한 내용은 기본 보기 사용을 참조하세요.
고급 시나리오에서 자체 컬렉션을 구현하려는 경우 IList 인터페이스 사용을 고려하세요. 이 인터페이스는 인덱스를 통해 개별적으로 액세스하여 성능을 개선할 수 있는 개체의 비제네릭 컬렉션을 제공합니다.
데이터 바인딩의 권한 요구 사항
.NET Framework와 달리 .NET은 완전 신뢰 보안으로 실행됩니다. 모든 데이터 바인딩은 애플리케이션을 실행하는 사용자와 동일한 액세스 권한으로 실행됩니다.
참고 항목
.NET Desktop feedback