2010-07-11 2 views
3

ItemsControl에 렌더링이 많은 항목 템플릿이 있고 ItemsSource이 변경을 알릴 때 하위 항목 템플릿의 레크리에이션을 최소화하고 싶습니다. ObservableCollection은 (전체 목록과 달리) 변경된 내용을 정확하게 WPF에 알릴 수 있는지, 컬렉션 변경 내용을 렌더링하는 것이 더 효율적인지 또는 WPF가 이전 항목 뷰를 발견 할만큼 재사용 할만큼 똑똑한지를 알기 때문에 궁금합니다. 동일한 항목이 여전히 변경된 목록에 있습니다.ObservableCollection에 ItemsControl을 바인딩하고 있습니까 <T>보다 효율적으로 <T>을 바인딩하고 있습니까?

답변

4

귀하의 의혹은 맞습니다. WPF는 이전보기를 다시 사용하지 않습니다. ItemsControl의 ItemsSource를 새 List로 바꾸면 동일한 항목이 이전 목록에 있던 경우에도 목록의 각 항목에 대해 완전히 새로운보기가 만들어집니다.

사용자 정의 컨트롤을 ItemTemplate에두고 중단 점 또는 디버그 로깅을 해당 생성자에 추가하여 직접 테스트 할 수 있습니다. ItemsSource를 동일한 목록으로 바꾸면 목록의 각 항목에 대해 컨트롤이 한 번 구성됩니다. 반면에 ObservableCollection에 항목을 추가하면 해당 항목이 한 번만 표시됩니다.

가상화 패널을 사용하고 컨테이너 재활용을 활성화 한 경우 ItemsControl은 컨테이너 (예 : ListBoxItem)를 다시 사용할 수 있습니다. http://blogs.msdn.com/b/vinsibal/archive/2008/05/14/recycling-that-item-container.aspx을 참조하십시오. 그러나 여전히 컨테이너의 내용을 재사용 할 수는 없습니다.

+0

위대한 답변! 감사 :) – devios1

0

ObservableCollection은 개체 추가 및 제거에 대해서만 알려주므로 예상 한 것만 큼 정확하지는 않습니다 (목록 내의 개체가 변경되면 ObservableCollection에서 알림을 실행하지 않습니다).

관련 문제