2014-04-04 3 views
0

ListView의 항목이 너무 많아서 'VirtualizingStackPanel.IsVirtualizing'을 'true'로 설정하고 'VirtualizingStackPanel.VirtualizationMode'를 'Recycling'으로 설정했습니다. ListView의 SelectionMode가 확장되어 있고, ListViewItem의 'IsSelected'속성이 내 모델의 'IsSelected'속성에 바인딩되어 있고, 바인드 모드는 두 가지 방법입니다. 나는 모든 항목을 선택하려면 Ctrl + A를 사용하려는 경우ListView ItemsContainer를 VirtualizationStackPanel로 설정하면 선택 항목을 올바르게 가져올 수 없습니다.

, 그것은 단지 항목의 일부를 선택, 그래서 나는 모든 방법을 아래와 같이 선택을 작성하는 키 바인딩을 사용

<KeyBinding Command="{Binding SelectAllCommand}" 
          Modifiers="Control" 
          Key="A"/> 

선택 SelectAll 방법 것입니다 ItemsSource 컬렉션을 반복하고 각 항목의 IsSelected 속성을 true로 설정하십시오. 그러나 그것은 또한 예기치 않은 어떤 것으로 이끌었다. 모든 항목을 선택하면 스크롤 막대를 맨 아래로 스크롤하면 ListView에 더 많은 항목이로드되고 한 항목을 한 번 클릭하면 예상되는 다른 항목은 모두 선택 취소됩니다.이 항목 만 선택하십시오. 하지만 다른 항목을 선택 취소하지 않은 것 같습니다.

아무도 도와 드릴 수 있습니까?

답변

0

Selector의 이러한 동작은로드 된 UI 요소에서만 작동 할 수 있기 때문에 예상됩니다. 가상화를 활성화하면 가시 영역에 포함 된 요소 만로드했습니다. 따라서 셀렉터는 다른 사람들에 대해 "알지 못합니다".

이 문제를 해결하려면 선택기가 이전에 선택한 항목에 대해 "알고"있어야합니다. 즉, 선택한 UI 요소를 언로드하는 것을 금지해야합니다. ,

public class MyVirtualizingStackPanel : VirtualizingStackPanel 
{ 
    protected override void OnCleanUpVirtualizedItem(CleanUpVirtualizedItemEventArgs e) 
    { 
     var item = e.UIElement as ListBoxItem; 
     if (item != null && item.IsSelected) 
     { 
      e.Cancel = true; 
      e.Handled = true; 
      return; 
     } 

     var item2 = e.UIElement as TreeViewItem; 
     if (item2 != null && item2.IsSelected) 
     { 
      e.Cancel = true; 
      e.Handled = true; 
      return; 
     } 

     base.OnCleanUpVirtualizedItem(e); 
    } 
} 

다음 선택을 제공하는리스트 박스, ListView에, 트 리뷰 또는 다른 사용자 컨트롤에 기본 패널을 교체 :

먼저, 블랙 잭과 창녀와 자신의 가상화 패널을 만들 수 있습니다. 스타일을 통해 예를 들어 :

<Setter Property="ItemsPanel"> 
    <Setter.Value> 
     <ItemsPanelTemplate> 
      <blackjackandhookers:MyVirtualizingStackPanel/> 
     </ItemsPanelTemplate> 
    </Setter.Value> 
</Setter> 

... 또는, 직접 선택기 :

<YourSelector.ItemsPanel> 
    <ItemsPanelTemplate> 
     <blackjackandhookers:MyVirtualizingStackPanel/> 
    </ItemsPanelTemplate> 
</YourSelector.ItemsPanel> 

즐기십시오!

답변이 도움이되기를 바랍니다.