2014-03-07 73 views
0

我使用一个ItemsControl显示条目的ALIST和ITRS XAML是像ItemsControl的渲染慢慢

<ItemsControl ItemsSource="{Binding ShelfItemsCollection}" Name="shelfGridView" Margin="5" > 
<ItemsControl.ItemTemplate> 
     <DataTemplate> 
     <Stackpanel>       
     <Image Width="150" Height="200" Stretch="Fill" Source="{Binding CoverImage}" ></Image> 
     + 
     some other infos 
     </Stackpanel> 
     </DataTemplate> 
</ItemsControl.ItemTemplate> 
<ItemsControl.ItemsPanel> 
<ItemsPanelTemplate>      
      <WrapPanel Orientation="Horizontal" />      
    </ItemsPanelTemplate> 
</ItemsControl.ItemsPanel> 

我现在面临的问题是我在列表中有近100个项目,我做了一些根据某些属性对列表进行过滤操作,并将结果限制为较少(否一次说20个项目),以便进行此过滤,因此需要花费大量时间来刷新和加载列表视图。 这是我用来过滤

ICollectionView dataView = CollectionViewSource.GetDefaultView(shelfGridView.ItemsSource); 
dataView.Filter = CloudFilter; 
dataView.Refresh(); 
private bool CloudFilter(object item) 
{ 
MyObject lib = item as MyObject; 
return lib.Property !=valuetofilter; 
} 

什么办法可以改善演出]或慢速呈现任何具体原因的代码?

+0

您是否使用过滤器将项目限制为20? –

+0

根据一些属性限制项目,你可以看到CloudFilter(),基于一个属性值,例如,如果property.Contains(“日本”),那么它只显示与期限日本相关的记录,它不需要计数将会是20.我也编辑了这个问题 –

+0

发布更多的代码让我们测试你的例子和你的数据结构。 –

回答

0

ItemsControl不支持UI virtualization。使用ListBox或使ItemsControl UI虚拟化。

您可以通过以下一些步骤启用ItemsControl的UI虚拟化:

  1. 上ItemsControl的设置VirtualizingStackPanel.IsVirtualizing="True"
  2. 设置ItemsPanelVirtualizingStackPanel
  3. 重写 ItemsControl并将ItemsPresenter包裹在ScrollViewer之内。
  4. 在ItemsControl上设置ScrollViewer.CanContentScroll="True"

上述建议的详细信息可以找到here


而且,你是直接设置ItemsSource到SourceCollection即ShelfItemsCollection,后来被越来越下面该集合创建defualtView对其进行筛选。直接绑定sourceCollection将强制ItemsControl(非虚拟化课程)生成100个容器来托管您的基础对象。

相反,您应该创建ICollectionView并在其上设置筛选器谓词并将ItemsSource绑定到该实例。也许你也可以创建CollectionViewSource并绑定它。如果你使用过滤的实例绑定,它将只生成20个容器(非虚拟化的ItemsControl)。 Ofcourse,在ItemsControl上启用UI虚拟化,将只为GUI上的可见UI项目生成容器。