데이터 바인딩 성능 문제를 다루기 전에 WPF(Windows Presentation Foundation) 데이터 바인딩 엔진에서 바인딩의 개체 참조를 확인하는 방법을 살펴보는 것이 도움이 됩니다.
WPF(Windows Presentation Foundation) 데이터 바인딩의 소스는 CLR 개체일 수 있습니다. CLR 개체의 속성, 하위 속성 또는 인덱서에 바인딩할 수 있습니다. 바인딩 참조는 Microsoft .NET Framework 리플렉션이나 ICustomTypeDescriptor를 사용하여 확인합니다. 다음은 바인딩의 개체 참조를 확인하는 세 가지 방법입니다.
첫 번째 방법에서는 리플렉션을 사용합니다. 이 경우 PropertyInfo 개체를 사용하여 속성의 특성을 검색하고 속성 메타데이터에 대한 액세스를 제공합니다. ICustomTypeDescriptor 인터페이스를 사용할 경우 데이터 바인딩 엔진은 이 인터페이스를 통해 속성 값에 액세스합니다. ICustomTypeDescriptor 인터페이스는 개체에 정적 속성 집합이 없는 경우에 특히 유용합니다.
INotifyPropertyChanged 인터페이스를 구현하거나 TypeDescriptor에 연결된 변경 알림을 사용하여 속성 변경 알림을 제공할 수 있습니다. 그러나 속성 변경 알림을 구현하는 더 나은 전략은 INotifyPropertyChanged를 사용하는 것입니다.
소스 개체가 CLR 개체이고 소스 속성이 CLR 속성이 경우 WPF(Windows Presentation Foundation) 데이터 바인딩 엔진에서는 먼저 소스 개체에 대해 리플렉션을 사용하여 TypeDescriptor를 가져온 다음 PropertyDescriptor에 대해 쿼리해야 합니다. 이러한 일련의 리플렉션 작업은 너무 많은 시간을 소비할 수 있으므로 성능 면에서 좋지 않습니다.
개체 참조를 확인하는 두 번째 방법에서는 INotifyPropertyChanged 인터페이스를 구현하는 CLR 소스 개체와 CLR 속성인 소스 속성을 사용합니다. 이 경우 데이터 바인딩 엔진에서는 소스 형식에 대해 직접 리플렉션을 사용하여 필요한 속성을 가져옵니다. 이 또한 최적의 방법은 아니지만 첫 번째 방법보다 작업 집합 요구 사항이 적어 비용이 적게 듭니다.
개체 참조를 확인하는 세 번째 방법에서는 DependencyObject인 소스 개체와 DependencyProperty인 소스 속성을 사용합니다. 이 경우 데이터 바인딩 엔진에서 리플렉션을 사용할 필요가 없습니다. 대신 속성 엔진과 데이터 바인딩 엔진이 함께 속성 참조를 독립적으로 확인합니다. 이것이 데이터 바인딩에서 사용되는 개체 참조를 확인하는 최적의 방법입니다.
아래 표에서는 이러한 세 가지 방법을 사용하여 TextBlock 요소 1000개의 Text 속성에 데이터를 바인딩할 때 속도를 비교합니다.