2012-03-05 6 views
11

AddRange 또는 RemoveRange과 같은 작업을 지원하는 ObservableCollection으로 인한 잠재적 문제는 무엇입니까? ObservableCollection이 WPF에서 자주 사용되므로 Microsoft에서 제공하지 않은 이유가 있어야합니다.ObservableCollection이 일괄 변경을 지원하지 않는 이유는 무엇입니까?

대량 작업을 지원하는 자체 컬렉션을 구현하고 INotifyCollectionChanged을 구현할 수 있습니다. 이러한 컨트롤을 ItemsControl에 바인딩하면 어떻게됩니까?

대량 변경을 지원하지 않는 ItemsControl을 아는 사람이 있습니까?

+6

을 예상대로 그들은 당신의 UI와 함께 작동합니다 것을 발견 할 것이다 이러한 '범위'유형의 사업장을 운영하고있다 컬렉션을 결합하는 경우가 아닌 이상. Intellisense.BulkObservableCollection http://msdn.microsoft.com/en-us/library/dd867973.aspx – tofutim

답변

3

잠재적 인 단점이나 문제가 있다고 생각하지 않습니다. 단지 거기에없는 것입니다. 실제로 'System.Collections.Generic'의 대부분의 유형은 'AddRange'기능을 제공하지 않습니다.

한편 많은 사람들이 원하는 기능을 제공하기 위해 'ObservableCollection'의 자체 버전을 만들었습니다.INotifyCollectionChanged에는 핸들러가 여러 항목에 영향을 미친 시점을 기록하기에 충분한 정보가 들어 있습니다.

마지막으로 당신은 당신이 Microsoft.VisualStudio.Language에서 BulkObservableCollection 클래스가있다

4

인터넷에서 추가/제거 범위 개념을 추가하거나 업데이트를 연기하고 수동으로 실행할 수있는 ObservableCollection 확장이 많이 있습니다.

:

ObservableCollection Doesn't support AddRange method, so I get notified for each item added, besides what about INotifyCollectionChanging?

당신은 또한 UI가 컬렉션에있는 모든 항목을 다시 렌더링하게됩니다 리셋 이벤트를 발생시키는 대량 추가 기능을 구현할 수 있습니다 : 예를 들어,이 스택 오버플로 질문을 참조

http://peteohanlon.wordpress.com/2008/10/22/bulk-loading-in-observablecollection/

이렇게하면 UI 업데이트를보다 효율적으로 관리 할 수 ​​있습니다. ItemsControl이 변경된 항목 목록을 세부적으로 나타내는 컬렉션 변경 이벤트를 처리하는 방법은 WPF 프레임 워크 자체에 달려 있습니다. 나는 이것을 지능적으로 처리한다고 가정하고있다!

성능이 중요하고 많은 항목이 업데이트되어 성능 문제가있는 모음이있는 경우 ObservableCollection 하위 클래스를 사용하여 응용 프로그램의 요구에 가장 적합한 방식으로 컬렉션 변경 알림을 관리하십시오.

+0

링크 된 질문의 구현을 빠르게 보면 비효율적 인 구현이 나타납니다. 기본적으로, 추가 된 모든 항목에 대해 'CollectionChanged' 이벤트가 발생하고 다시 콜렉션을 재설정합니다! –

+1

@KentBoogaart 안녕하세요 켄트, 그 대답을 의미합니까? 내게 잘 보인다. AddRange 메서드는 추가 된 항목을 반복 한 다음 추가 된 항목 목록을 제공하는 'add'변경 유형을 사용하여 단일 CollectionChanged 이벤트를 발생시킵니다. RangeObservableCollection은 ObservableCollection을 확장하므로 코드의 형식이 좋지는 않습니다. – ColinE

+1

모든 항목에 대해 Add를 호출하면 추가 된 모든 항목에 대해 CollectionChangedEvent가 발생합니다. 그런 다음 모든 항목이 추가 된 후에 컬렉션을 재설정하여 모든 노력을 낭비합니다. –

2

에는 색인 정보가 포함되어 있습니다. 항목을 제거하면 항목을 삽입하는 것처럼 색인이 다시 병합됩니다. 따라서 전적으로 불가능한 것은 아니지만 범위 작업을 수행하는 것이 다소 어렵고 비효율적 일 수 있습니다.

+0

유일한 색인 정보는 "변경이 발생한 색인"입니다. 이 정보는 추가 및 제거 조작으로 쉽게 제공됩니다. –

+0

@ A.R .: 아니요, 컬렉션의 첫 번째 항목과 마지막 항목을 제거하면 어떻게됩니까? 이벤트 인수에는 하나의 인덱스 만 있지만 두 개의 인덱스가 필요합니다. –

+0

두 개의 인덱스가 있습니다. 'NewStartingIndex'와 'OldStartingIndex'가 있습니다. 후자의 설명에 "이동, 제거 또는 바꾸기 작업이 발생한 인덱스를 가져옵니다."라는 메시지가 표시됩니다. 컬렉션의 모든 항목을 제거하지 않으면 범위에있는 요소가 설명되어 있으므로 시나리오가 불가능합니다. 연속적이다. –

1

마이크로 소프트가 그들에게 기능의 가능한 모든 부분을 제공하지 않습니다

를 제공하지 않은 이유가 있어야합니다, 그것은 (또한) 수요 것은 대 비용입니다.

대량 작업을 지원하는 자신의 컬렉션을 구현하고 INotifyCollectionChanged을 구현할 수 있습니다.

예. 그렇게하면 컬렉션이 해당 변경 사항을 언제 어떻게 전파 할 것인지 선택해야합니다. 나는 시도한 적이 없지만 View 또는 ViewModel이 재사용 가능한 컬렉션보다 더 나은 결정을 내릴 수있는 절충점이 있다고 상상해보십시오.

관련 문제