2010-05-11 4 views
1

ListView를 사용하여 목록에 항목을 표시하고 있습니다. 사용자는 항목을 직접 선택하거나 '사전 선택 키'를 사용하여 지정된 속성이있는 항목을 선택할 수 있습니다.WPF Listview - '시야'외부 항목 선택

for(int i;i<MyListView.Items.Count;++i) 
{ 
    if(/*... Check if the items should be selected ...*/) 
     (MyListView.ItemContainerGenerator.ContainerFromIndex(i) as ListViewItem).IsSelected = true; 
} 

이 excecution시 볼 수 있습니다 항목에 대해 완벽하게 작동합니다 :

내가 그런 일을 사용하는 항목을 확인합니다. 그러나 표시되지 않는 항목의 경우 ContainerFromIndex()는 null을 반환합니다. 나는 이것이 가상화와 관련이 있다고 들었고 List는 '시야'의 위 또는 아래 항목에 대해 알지 못한다고 들었다. 그러나 수동으로 선택하면 List of the field의 'field of view'에서 항목을 선택하는 것이 어떻게 가능합니까?

그리고 '시야'밖에서 항목을 선택하는 방법은 무엇입니까? 그게 가능해야한다고 생각합니다. 어떤 도움

감사합니다, 마크

답변

2

당신이 언급 한 바와 같이, 내 생각 엔 문제가있는 ListView 항목의 가상화 것입니다. 기본적으로 ListView (및 ListBox)는 성능을 향상시키기 위해 ItemsPanel로 VirtualizingStackPanel을 사용합니다. 그것이 어떻게 작동하는지에 대한 간단한 설명은 here으로 읽을 수 있습니다.

그러나 다른 패널을 대체 할 수 있습니다. 이 경우, 일반적인 StackPanel을 사용해보십시오. ListView에 많은 항목이있는 경우 특히 복잡한 항목 인 경우 성능이 약간 저하 될 수 있습니다. 솔루션

<ListView> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 

편집

또한 시도 할 수는 모델에 따라, at this similar question을 설명했다. 그러나 이것은 아마도 당신을 위해 작동하지 않습니다.

+0

하지만 아이템을 선택할 때 보이지 않게 스크롤하고 뒤로 스크롤하면 아이템이 선택됩니다. 이 정보는 반드시 저장해야합니다. 이게 실제로 접근 가능하지 않니? – Marks

+0

글쎄, 선택한 항목은'SelectedItems'를 통해 접근 할 수 있습니다. Add() 메서드가있는 IList를 반환합니다. 해당 목록에 선택한 항목을 추가하려고 했습니까? 즉, ListView에 표시 할 컬렉션에 관계없이이 IList에 항목을 추가해야합니다. 인덱스 만 사용하여이를 수행 할 수있는 방법이 없을 수도 있습니다. –

+0

이 답변을 주셔서 감사합니다. – Mark

0

가상화 항목 컨트롤을 처리 할 때 가상화를 비활성화하는 대신 (사실상 유용한 기능인 경우가 있지만 API의 다른 부분이 올바르게 작동하는 것을 방해하더라도) VirtualizingPanel을 찾아서 명시 적으로 스크롤하십시오. 내가 패널을 찾기 위해 시각적 트리를 검색 할 필요가 매우 행복하지 않다,하지만 난 그것을 얻을 수있는 다른 방법을 알고 아니에요,도

void ScrollToIndex(ListBox listBox, int index) 
{ 
    VirtualizingPanel panel = FindVisualChild<VirtualizingPanel>(listBox); 

    panel.BringIndexIntoViewPublic(index); 
} 

static T FindVisualChild<T>(DependencyObject o) where T : class 
{ 
    T result = o as T; 

    if (result != null) 
    { 
     return result; 
    } 

    int childCount = VisualTreeHelper.GetChildrenCount(o); 

    for (int i = 0; i < childCount; i++) 
    { 
     result = FindVisualChild<T>(VisualTreeHelper.GetChild(o, i)); 

     if (result != null) 
     { 
      return result; 
     } 
    } 

    return null; 
} 

: 예를 들어

가상화 패널을 다룰 때 특정 인덱스로 스크롤하십시오.