2011-05-09 5 views
6

속성 "VirtualizingStackPanel.VirtualizationMode"가 설정된 ListBox가 "재활용"으로 설정되어 있습니다. 사용자 지정 컬렉션 (구현 IListIList<T>)을 바인딩하고 있습니다.목록 상자 내에서보기 항목 가져 오기

이제 데이터가 바인딩되면 GetEnumerator가 호출됩니다. 그러면 public T this[int index] { } 속성이 현재보기의 모든 항목에 대해 호출됩니다.

제 질문은 (데이터가로드 된 후) 현재 보이는 항목을 얻는 방법입니다.

+0

당신은 여기에 답이 있습니다 항목 선택이 자동으로 항목이 표시 의미 왜 http://stackoverflow.com/questions/11187382/get-listview-visible-items – GameAlchemist

답변

3

언젠가 나는 또한 동일한 문제에 직면했다. 선택한 항목을 항상 볼 수 있기 때문에 목록 상자의 "SelectedItem"을 사용하여 내 문제의 해결 방법을 발견했습니다. 제 경우에는 문제를 일으키는 것이 스크롤이었습니다. - 또한
Virtualization issue in listbox

- Virtualization scrollview - Good One

+0

내가 볼 수없는, 그것은 매우 잘 선택 될 수 있지만보기에는 없습니다. –

+0

:) 개발자는 이제 익숙해졌습니다. – Rohit

1

비슷한 일을 알아 내려고 후 나는 (그것을 다른 답변보다 쉽게 ​​보인다) 나는 여기에 내 결과를 공유하는 것이라고 생각, 도움이된다면 당신은 모양을 가질 수있다

간단한 가시성 테스트는 내가 here에서 가져 왔습니다.

private static bool IsUserVisible(FrameworkElement element, FrameworkElement container) 
{ 
    if (!element.IsVisible) 
     return false; 

    Rect bounds = 
     element.TransformToAncestor(container).TransformBounds(new Rect(0.0, 0.0, element.ActualWidth, element.ActualHeight)); 
    var rect = new Rect(0.0, 0.0, container.ActualWidth, container.ActualHeight); 
    return rect.Contains(bounds.TopLeft) || rect.Contains(bounds.BottomRight); 
} 

는 그 후 당신은 ListBoxItems을 반복하고 볼 수있는 결정하기 위해이 테스트를 사용할 수 있습니다.

private List<object> GetVisibleItemsFromListbox(ListBox listBox, FrameworkElement parentToTestVisibility) 
{ 
    var items = new List<object>(); 

    foreach (var item in PhotosListBox.Items) 
    { 
     if (IsUserVisible((ListBoxItem)listBox.ItemContainerGenerator.ContainerFromItem(item), parentToTestVisibility)) 
     { 
      items.Add(item); 
     } 
     else if (items.Any()) 
     { 
      break; 
     } 
    } 

    return items; 
} 
관련 문제