답변:
안 ObservableCollection
정확히 어떤 수집과 같은 UI에서 업데이트 할 수 있습니다. 진정한 차이점은 간단합니다.
ObservableCollection<T>
INotifyCollectionChanged
컬렉션이 변경 될 때 알림을 제공하는 구현 (추측 ^^) 바인딩 엔진이 업데이트 될 때 UI를 업데이트 할 수 있습니다 ObservableCollection
.
그러나를 BindingList<T>
구현 IBindingList
합니다.
IBindingList
컬렉션 변경에 대한 알림 만 제공합니다. 다음과 같이 변경 사항에 따라 UI 업데이트보다 훨씬 더 많은 기능을 제공하기 위해 UI에서 사용할 수있는 모든 기능을 제공합니다.
이러한 기능 중 일부는 사용할 수 없습니다 ObservableCollection<T>
또 다른 차이점은 BindingList
해당 항목이 구현 될 때 항목 변경 알림 을 릴레이 한다는 것 INotifyPropertyChanged
입니다. 아이템이 PropertyChanged
이벤트를 발생 시키면 , 이벤트 BindingList
는 ListChangedEvent
with ListChangedType.ItemChanged
및 OldIndex=NewIndex
((아이템이 교체 된 경우 OldIndex=-1
)를 발생시킵니다.ObservableCollection
항목 알림을 릴레이하지 않습니다.
Silverlight에서는 BindingList
옵션으로 사용할 수 없습니다. 그러나 ObservableCollection
s 및 ICollectionView
( IPagedCollectionView
잘 기억하는 경우)를 사용할 수 있습니다 .
BindingList
무용지물?
실제 차이점은 BindingList는 WinForms이고 ObservableCollection은 WPF입니다.
WPF 관점에서 BindingList는 제대로 지원되지 않으므로 실제로 필요한 경우가 아니면 WPF 프로젝트에서 절대로 사용하지 않습니다.
포함 된 요소에 대한 기능 및 변경 알림과 같은 가장 중요한 차이점은 이미 받아 들여진 대답에 언급되어 있지만 더 언급 할 가치가 있습니다.
공연
AddNew
이 호출 되면 조회 BindingList<T>
를 통해 추가 된 항목을 IndexOf
검색합니다. 그리고 만약 T
구현이 INotifyPropertyChanged
변경된 요소의 인덱스는에 의해 검색되고 IndexOf
(긴 동일한 항목 반복적으로 변경하는만큼 새로운 룩업가 없지만). 컬렉션에 수천 개의 요소를 저장하는 경우 ObservableCollection<T>
(또는 IBindingList
O (1) 조회 비용 으로 사용자 지정 구현) 더 선호 될 수 있습니다.
완전성
IBindingList
인터페이스는 거대한 하나 (아마 가장 깨끗한 디자인)이며, 구현은 그것의 기능의 일부를 구현할 수 있습니다. 예를 들어 AllowNew
, SupportsSorting
및 SupportsSearching
속성인지 구별 AddNew
, ApplySort
및 Find
방법을 각각 사용할 수있다. BindingList<T>
정렬 자체를 지원하지 않는 사람들을 놀라게 합니다. 실제로 파생 클래스가 누락 된 기능을 추가 할 수있게 해주는 몇 가지 가상 메소드를 제공합니다. 이 DataView
클래스는 전체 IBindingList
구현 의 예입니다 . 그러나 처음에는 형식이 지정된 컬렉션이 아닙니다. 그리고 BindingSource
WinForms 의 클래스는 하이브리드 예제입니다. 정렬 IBindingList
을 지원하는 다른 구현을 래핑하면 정렬을 지원합니다.
ObservableCollection<T>
이미 INotifyCollectionChanged
인터페이스 의 완전한 구현입니다 (단일 이벤트 만 있음). 또한 가상 멤버가 있지만 ObservableCollection<T>
기본 기능과 동일한 이유로 Collection<T>
바인딩 기능을 조정하는 대신 (예 : 데이터 모델 콜렉션에서) 추가 / 제거 항목을 사용자 정의 하기 위해 일반적으로 파생됩니다 .
복사 대 포장
모두 ObservableCollection<T>
와 BindingList<T>
이미 존재하는 목록을 받아들이는 생성자를 보유하고 있습니다. 다른 컬렉션에서 인스턴스화 할 때 다르게 동작하지만 :
BindingList<T>
제공된 목록에 대한 관찰 가능한 래퍼 역할 을하며BindingList<T>
은 기본 컬렉션에도 반영됩니다.ObservableCollection<T>
반면에 새로운 List<T>
인스턴스를 기본 Collection<T>
생성자에 전달 하고 원래 컬렉션의 요소를이 새 목록에 복사합니다. 물론, T
참조 유형 인 경우 요소의 변경 사항은 원래 콜렉션에서 볼 수 있지만 콜렉션 자체는 업데이트되지 않습니다.하나 개는 더 큰 차이 사이 ObservableCollection
및 BindingList
그 편리하게 제공하고, 주제에 대한 입찰 의사 결정 요인이 될 수 있습니다 :
BindingList
리스트 변경 핸들러 :
ObservableCollection
컬렉션 변경 :
위의 요약 : 에서 항목의 속성이 변경
BindingList
되면ListChanged
이벤트가 속성 (Descriptionor의 속성)에 대한 완전한 세부 정보를ObservableCollection
제공 하며이를 제공하지 않습니다. 실제로ObservableCollection
항목에서 변경된 속성에 대한 변경 이벤트는 발생하지 않습니다.
위의 결론은 INotifyPropertyChanged
모델 클래스에서 구현 되는 것과 관련이 있습니다. 기본적으로 none은 항목에서 속성이 변경되면 변경된 이벤트를 발생시키지 않습니다.