ObservableCollection과 BindingList의 차이점


236

나는 그 차이를 알고 싶어 사이 ObservableCollectionBindingList 나는 소스에서 모든 추가 / 삭제 변경 통지를 모두 사용했기 때문에, 그러나 다른 이상을 선호 할 때 실제로 모른다.

왜 다음 중 하나를 선택해야합니까?

ObservableCollection<Employee> lstEmp = new ObservableCollection<Employee>();

또는

BindingList<Employee> lstEmp = new BindingList<Employee>();

답변:


278

ObservableCollection 정확히 어떤 수집과 같은 UI에서 업데이트 할 수 있습니다. 진정한 차이점은 간단합니다.

ObservableCollection<T>INotifyCollectionChanged컬렉션이 변경 될 때 알림을 제공하는 구현 (추측 ^^) 바인딩 엔진이 업데이트 될 때 UI를 업데이트 할 수 있습니다 ObservableCollection.

그러나를 BindingList<T>구현 IBindingList합니다.

IBindingList컬렉션 변경에 대한 알림 만 제공합니다. 다음과 같이 변경 사항에 따라 UI 업데이트보다 훨씬 더 많은 기능을 제공하기 위해 UI에서 사용할 수있는 모든 기능을 제공합니다.

  • 정렬
  • 수색
  • 공장을 통해 추가 (AddNew 멤버 기능).
  • 읽기 전용 목록 (CanEdit 속성)

이러한 기능 중 일부는 사용할 수 없습니다 ObservableCollection<T>

또 다른 차이점은 BindingList해당 항목이 구현 될 때 항목 변경 알림 을 릴레이 한다는 것 INotifyPropertyChanged입니다. 아이템이 PropertyChanged이벤트를 발생 시키면 , 이벤트 BindingListListChangedEventwith ListChangedType.ItemChangedOldIndex=NewIndex((아이템이 교체 된 경우 OldIndex=-1)를 발생시킵니다.ObservableCollection항목 알림을 릴레이하지 않습니다.

Silverlight에서는 BindingList옵션으로 사용할 수 없습니다. 그러나 ObservableCollections 및 ICollectionView( IPagedCollectionView잘 기억하는 경우)를 사용할 수 있습니다 .


5
고려해야 할 또 다른 사항은 성능입니다. themissingdocs.net/wordpress/?p=465
Jarek Mazur

고맙습니다, 나는 BindingList의 실제 구현에 대해 몰랐습니다. 나는 ObservableCollection과 ICollectionView를 사용하는 경향이있다
Eilistraee

5
이 답변의 정보는 정확하지만 모든 WPF 사용자는 다음을주의해야합니다. BindingList는 INotifyCollectionChanged를 구현하지 않으며 컨트롤의 ItemsSource 속성에 바인딩 된 경우 메모리 누수가 발생합니다. ObservableCollection은 인터페이스를 구현하며 이러한 누수를 일으키지 않습니다.
Brandon Hood

1
BindingList가 정렬을 구현하는 경우 BindingList에 바인딩 된 그리드를 정렬 할 수없는 이유는 무엇입니까?
Robert Harvey

BindingList무용지물?
Shimmy Weitzhandler

27

실제 차이점은 BindingList는 WinForms이고 ObservableCollection은 WPF입니다.

WPF 관점에서 BindingList는 제대로 지원되지 않으므로 실제로 필요한 경우가 아니면 WPF 프로젝트에서 절대로 사용하지 않습니다.


1
흥미 롭군 Silverlight Dev는 그 사실을 몰랐습니다. 감사. 정렬 및 필터링을 원한다면 ICollectionView 구현이 친구입니다 ^^
Eilistraee

27
"지원되지 않는"이유는 무엇입니까? ViewManager (내부)는 PresentationFramework 어셈블리 내에 있으며이를 지원합니다. 예를 들어 ItemsControl에 바인딩하면 변경 알림이 적용됩니다 (즉, 항목이 추가 및 제거됨). WinForms에 특화된 경우 Forms 네임 스페이스에 더 적합하지 않아야합니까?
David Kiff

7
David와 동의 한 경우 System.Collections 네임 스페이스에 있으므로 WPF에서 완전히 지원해야합니다. WPF는 다른 UI 레이아웃 방식입니다.
저스틴

13
David 와도 동의합니다. ObservableCollection은 항목의 속성 변경 알림을 버블 링하지 않기 때문에 WPF에서 BindingList를 자주 사용합니다.
기억 상실

3
"지원하지 않는"에 대한 예제를 제공하려면 WPF 응용 프로그램에서 INotifyCollectionChanged를 구현하지 않는 일부 BindingList로 인해 메모리 누수가 발견되었습니다.
Breeze

4

포함 된 요소에 대한 기능 및 변경 알림과 같은 가장 중요한 차이점은 이미 받아 들여진 대답에 언급되어 있지만 더 언급 할 가치가 있습니다.

공연

AddNew이 호출 되면 조회 BindingList<T>를 통해 추가 된 항목을 IndexOf검색합니다. 그리고 만약 T구현이 INotifyPropertyChanged변경된 요소의 인덱스는에 의해 검색되고 IndexOf(긴 동일한 항목 반복적으로 변경하는만큼 새로운 룩업가 없지만). 컬렉션에 수천 개의 요소를 저장하는 경우 ObservableCollection<T>(또는 IBindingListO (1) 조회 비용 으로 사용자 지정 구현) 더 선호 될 수 있습니다.

완전성

  • IBindingList인터페이스는 거대한 하나 (아마 가장 깨끗한 디자인)이며, 구현은 그것의 기능의 일부를 구현할 수 있습니다. 예를 들어 AllowNew, SupportsSortingSupportsSearching속성인지 구별 AddNew, ApplySortFind방법을 각각 사용할 수있다. BindingList<T>정렬 자체를 지원하지 않는 사람들을 놀라게 합니다. 실제로 파생 클래스가 누락 된 기능을 추가 할 수있게 해주는 몇 가지 가상 메소드를 제공합니다. 이 DataView클래스는 전체 IBindingList구현 의 예입니다 . 그러나 처음에는 형식이 지정된 컬렉션이 아닙니다. 그리고 BindingSourceWinForms 의 클래스는 하이브리드 예제입니다. 정렬 IBindingList을 지원하는 다른 구현을 래핑하면 정렬을 지원합니다.

  • ObservableCollection<T>이미 INotifyCollectionChanged인터페이스 의 완전한 구현입니다 (단일 이벤트 만 있음). 또한 가상 멤버가 있지만 ObservableCollection<T>기본 기능과 동일한 이유로 Collection<T>바인딩 기능을 조정하는 대신 (예 : 데이터 모델 콜렉션에서) 추가 / 제거 항목을 사용자 정의 하기 위해 일반적으로 파생됩니다 .

복사 대 포장

모두 ObservableCollection<T>BindingList<T>이미 존재하는 목록을 받아들이는 생성자를 보유하고 있습니다. 다른 컬렉션에서 인스턴스화 할 때 다르게 동작하지만 :

  • BindingList<T>제공된 목록에 대한 관찰 가능한 래퍼 역할 을하며BindingList<T> 은 기본 컬렉션에도 반영됩니다.
  • ObservableCollection<T>반면에 새로운 List<T>인스턴스를 기본 Collection<T>생성자에 전달 하고 원래 컬렉션의 요소를이 새 목록에 복사합니다. 물론, T참조 유형 인 경우 요소의 변경 사항은 원래 콜렉션에서 볼 수 있지만 콜렉션 자체는 업데이트되지 않습니다.

1

하나 개는 더 큰 차이 사이 ObservableCollectionBindingList그 편리하게 제공하고, 주제에 대한 입찰 의사 결정 요인이 될 수 있습니다 :

BindingList 리스트 변경 핸들러 :

바인딩리스트리스트 변경

ObservableCollection 컬렉션 변경 :

ObervableCollection 컬렉션 변경

위의 요약 : 에서 항목의 속성이 변경 BindingList되면 ListChanged이벤트가 속성 (Descriptionor의 속성)에 대한 완전한 세부 정보를 ObservableCollection제공 하며이를 제공하지 않습니다. 실제로 ObservableCollection항목에서 변경된 속성에 대한 변경 이벤트는 발생하지 않습니다.

위의 결론은 INotifyPropertyChanged모델 클래스에서 구현 되는 것과 관련이 있습니다. 기본적으로 none은 항목에서 속성이 변경되면 변경된 이벤트를 발생시키지 않습니다.


나는 이것이 (PropertyDescriptor) 메모리 누수의 원인이라고 생각합니다
Abdulkarim Kanaan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.