List <T> 대 BindingList <T> 장점 / 단점


93

누군가 내 프로젝트에서 둘의 차이점을 설명 할 수 있습니까?

현재 나는 List<MyClass>BindingSource를 가지고 있고 DataGridView를 BindingSource로 설정합니다.

IEditableObjectCancelEdit가 호출 될 때 객체를 원래 상태로 되돌 리도록 구현 했습니다.Memberwise.Clone()

내 목록을 BindingList로 변경하면이 문제가 해결되며 BindingList를 사용하면 어떤 이점이 있습니까?

답변:


124

A List<>는 몇 가지 도우미 함수 (예 : 정렬)가있는 주어진 유형의 항목으로 구성된 자동 크기 조정 배열입니다. 데이터 일 뿐이며 모델의 개체 집합에서 작업을 실행하는 데 사용할 가능성이 높습니다.

A BindingList<>IBindingList인터페이스 를 구현하는 형식화 된 목록 또는 컬렉션을 둘러싼 래퍼 입니다. 이것은 양방향 데이터 바인딩을 지원하는 표준 인터페이스 중 하나입니다. ListChanged항목을 추가, 제거 또는 설정할 때 발생 하는 이벤트 를 구현하여 작동 합니다. 바인딩 된 컨트롤은 디스플레이를 새로 고칠시기를 알기 위해이 이벤트를 수신합니다.

BindingSource의 DataSource를으로 설정 List<>하면 내부적으로 BindingList<>목록을 래핑하기 위해 를 만듭니다 . BindingList<>BindingSource 외부에서 액세스하려는 경우 목록을 yourself 로 사전 래핑 할 수 있지만 그렇지 않으면 동일합니다. 에서 상속하여 BindingList<>항목을 변경할 때 특별한 동작을 구현할 수도 있습니다.

IEditableObjectBindingSource에서 처리합니다. 바인딩 된 컨트롤의 데이터를 변경할 때 모든 구현 개체에서 BeginEdit를 호출합니다. 그런 다음 BindingSource에서 EndEdit / CancelEdit를 호출하면 개체에 전달됩니다. 다른 행으로 이동하면 EndEdit도 호출됩니다.


현재 내 List <T> 접근 방식에서 CancelEdit를 호출하면 편집중인 항목이 원래 상태로 돌아 가지 않으므로 Clone ()을 사용합니다. 바인딩리스트가 나를 위해 그것을 처리 할 것이라는 말입니까?
Jon

3
아니요, BindingList는 해당 기능과 관련이 없습니다. BindingSource는 기본 목록의 유형에 관계없이 현재 개체에 대해 CancelEdit를 호출합니다. 일반 객체에 대한 객체 버전 관리를 자동으로 구현하는 프레임 워크는 없습니다. 이 용도로만 데이터의 원본 복사본을 유지하는 DataTables / DataRows를 사용할 수 있습니다.
Alex J

컨트롤이 목록이 변경되는시기를 알아야한다고 말씀 하셨는데 더 설명해 주시겠습니까? datagridview가있는 양식과 채워진 데이터가있는 다른 양식이 있습니다. 이 문제에 대한 당신의 말에 대해 걱정해야합니까?
Jon

예를 들어 DataGrid는 새 행을 추가하기 위해 항목이 목록에 추가되는시기를 알아야합니다. 이를 위해 BindingList의 ListChanged 이벤트를 사용합니다. 그리드를 List <T>에 직접 바인딩하면 이벤트가 발생하지 않고 그리드가 목록을 변경 한시기를 알 수 없습니다. BindingSource가 BindingList에 List <T>를 자동으로 래핑하므로 시나리오에서 걱정할 필요가 없습니다. 목록 자체가 아닌 BindingSource로 작업하는 한 컨트롤은 동기화 상태를 유지합니다.
Alex J

WPF UI (mvvm 방식)에 BindingList를 사용하는 해결 방법이 있습니까? 바인딩 목록을 관찰 가능한 컬렉션으로 래핑 할 수 있습니까?
Lance

13

BindingList는 이벤트를 사용하여 양방향 데이터 바인딩을 허용하며, List는 컬렉션이 변경 될 때 이벤트를 발생시키지 않습니다.

나는 그것이 당신의 특정 문제를 고칠 것이라고 생각하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.