ListBox.SelectedItems作为HashSet

时间:2013-04-16 22:02:35

标签: c# wpf list

取消选择大量项目时,我在ListBox中遇到了性能问题。 我的列表框目前包含90,000多个项目。

我认为性能问题是因为SelectedItems由List而不是HashSet表示。

重新创建ListBox功能,支持多选,以及将选定项实现为哈希集的最简单方法是什么。

我不需要支持selectedindex,我认为这是选择项目列表的原因。

2 个答案:

答案 0 :(得分:1)

你应该找到一种虚拟化ListBox的方法,这样就不会将所有元素都加载到内存中并立即添加到列表中,而是控件的占用空间只包含当前可见的元素并加载其他元素只有在滚动时,才会按需提供某种类似网络的负载......

此答案详细介绍了该问题:https://stackoverflow.com/a/2784220/559144

此链接非常有用:Optimizing Performance: Controls

它告诉您WPF ListBox实际上确实通过desfault支持虚拟化,并且您还可以启用:

  • 集装箱回收
  • 延迟滚动

答案 1 :(得分:0)

我所做的是创建一个管理选择的类,将选择存储为HashMap。 然后我处理了ListBoxItem上的MouseDown并模仿了shift和ctrl选择。

我将选择更改为单一,基本上忽略了默认选择反射。

这是我的XAML。

<ListBox Margin="2" 
 Grid.Column="0" 
 Name="WordList" 
 ItemsSource="{Binding Source={StaticResource CVS}}"
 SelectionMode="Single">
   <ListBox.ItemContainerStyle>
      <Style TargetType="{x:Type ListBoxItem}">
         <EventSetter Event="PreviewMouseDown" Handler="Clicked"/>
         <EventSetter Event="PreviewMouseMove" Handler="MouseMoved"/>
         <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type ListBoxItem}">
                  <TextBlock Name="Text" Text="{Binding Word}"/>
                  <ControlTemplate.Triggers>
                     <DataTrigger Binding="{Binding IsSelected}" Value="True">
                        <Setter TargetName="Text" Property="Background" Value="LightBlue"/>
                     </DataTrigger>
                  </ControlTemplate.Triggers>
               </ControlTemplate>
            </Setter.Value>
         </Setter>
      </Style>
   </ListBox.ItemContainerStyle>