2012-09-24 3 views
1

ListBox가 가상화되지 않았습니다. 분명히 뭔가 빠졌지 만 찾을 수는 없습니다.ListBox가 가상화되지 않음

실제로 ListBox 내의 ListBox입니다. 외부 ListBox에는 Expander가 포함 된 ItemTemplate이 있습니다. 확장기는 항목 그룹을 표시하는 데 사용됩니다. Expander의 내용은 항목을 표시하는 두 번째 ListBox입니다. 두 번째 ListBox의 ItemTemplate은 표시 할 실제 Item에 바인딩됩니다. 내 항목에 대한 ViewModel 클래스에는 Get 속성이 호출 될 때까지 데이터를 초기화하지 않는 여러 속성이 있습니다. 그러나 WPF는 모든 항목을 처리하고 초기화 논리를 유발하므로 피하려고합니다.

ListCollectionView.GroupDescription을 사용하면 ListBox가 가상화되지 않음을 발견했습니다. 이제 ViewModel에서 내 그룹을 처리하고 있습니다. 내 외부 ListBox는 ObservableCollection (ItemGroupViewModel)에 바인딩됩니다. 여기서 ItemGroupViewModel에는 GroupName과 Item 목록이 있습니다. 두 번째 ListBox는 ItemGroupViewModel의 Items에 바인딩됩니다. 이것은 문제를 해결하지 못했습니다. 나는 또한 디버깅하는 동안 VirtualizingStackPanel.GetIsVirtualizing()을 확인하고 true를 반환하지만 WPF는 여전히 모든 항목을 처리하고 있습니다. 내 그룹화 논리가 각 항목의 데이터 초기화 논리를 실행하지 않도록 두 번 검사했는데 피하려고합니다.

IsSharedSizeScope로 인해 ListBox가 모든 항목을 렌더링하여 열 사이징을 결정할 수 있다고 생각했습니다. 그래서 SharedSizeScope를 해제했습니다. 아직 가상화가 없습니다.

무엇이 누락 되었습니까?

답변

2

확장기 내부에 있기 때문에 가상화되지 않습니다. 확장기의 템플릿은 headeredcontentcontrol입니다 (기억하는 한). 템플릿에는 스택 패널이 있습니다.

StackPanel의 내용은 스택하는 방향으로 결코 정렬 할 수 없으므로 목록 상자에는 항상 요청하는 모든 공간이 있고 가상화가 없습니다. 내부 목록 상자에 수직 스크롤 막대가 없습니다. - 아마 가장 쉬운 당신의 내면의 목록 상자에 최대 높이 설정 :

당신은 하나 개의 솔루션 (적어도 :

일이있다.

희망 하시겠습니까?

+0

감사합니다. 필요한 모든 공간을 제공하는 StackPanel이 적합합니다. ControlTemplate을 변경하는 방법을 살펴 보겠습니다. 그 작동하지 않는 경우 TreeView 사용하여 살펴 보겠습니다. – Jayson

+0

확장기 템플릿을 조사했지만 StackPanel이 없습니다. 헤더 용 ToggleButton과 컨텐트 용 ContentPresenter. 나는 나무 위로 이사 왔고 한계를 찾고있다. 다중 선택 및 가상화는 루트 항목에서만 작동하는 것 같지 않습니다. 응. 좀 더 연구를 한 후에 TreeView에 또 다른 질문을 게시 할 것입니다. – Jayson

+0

아, 예 - 저는 약간 떨어져있었습니다. HeaderedContentControl에서 파생되었지만 ControlTemplate은 실제로 dockpanel입니다. 그래서 해결책 2는 배제됩니다. 귀하의 설명을 다시 볼 때 목록 상자에 항목에 대한 스택 패널이있는 하위 목록 상자가 있습니다. 따라서 외부 목록 상자가 가상화됩니까? 내 생각에 당신은 내부 목록 상자에 MaxHeight를 설정하여 가상화하도록해야한다고 생각합니다. TreeView 정보 - 내가 아는 한 treeview에 대한 가상화가 전혀 없습니다. –

관련 문제