我正在为我的应用程序构建一个搜索功能,其中匹配产品的列表应该在每次击键时更新,但它太慢了,奇怪的是GUI中的实际更新时间比它的时间长得多用于从数据库中检索匹配的产品。
为了避免列表中的慢速滚动,我正在使用如下所述的虚拟化:http://www.codeproject.com/Articles/34405/WPF-Data-Virtualization,滚动现在可以非常顺利地进行,但是对于大约30000个产品更新列表需要几秒钟,写入时也同样慢第4个字母(然后产生< 100个产品),就像写第一个字母一样。
代码类似于codeproject one, XAML:
<ListView Grid.Row="7" Grid.ColumnSpan="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="2" Style="{DynamicResource lvStyle}"/>
<Style x:Key="lvStyle" TargetType="{x:Type ListView}">
<Setter Property="VirtualizingStackPanel.IsVirtualizing" Value="True"/>
<Setter Property="VirtualizingStackPanel.VirtualizationMode" Value="Recycling"/>
<Setter Property="ScrollViewer.IsDeferredScrollingEnabled" Value="True"/> <!-- Todo was originally true -->
<Setter Property="ListView.ItemsSource" Value="{Binding ProductNames}"/>
<Setter Property="ListView.View">
<Setter.Value>
<GridView>
<GridViewColumn Header="Id" Width="100">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding ProductID}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Name" Width="150">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</Setter.Value>
</Setter>
<!-- <Style.Triggers>
<DataTrigger Binding="{Binding IsLoading}" Value="True">
<Setter Property="ListView.Cursor" Value="Wait"/>
<Setter Property="ListView.Background" Value="LightGray"/>
</DataTrigger>
</Style.Triggers>-->
</Style>
ViewModel:
private VirtualizingCollection<ProductName> productNames;
public VirtualizingCollection<ProductName> ProductNames
{
get
{
if(productNames == null)
productNames = new VirtualizingCollection<ProductName>(new ProductNameProvider(ProductNamesQuery()),100);
return productNames;
}
}
我的ProductNameProvider:
public class ProductNameProvider : IItemsProvider<Models.ProductName>
{
private IQueryable<Models.ProductName> _query;
public ProductNameProvider(IQueryable<Models.ProductName> query )
{
_query = query;
}
public int FetchCount()
{
return _query.Count();
}
public IList<Models.ProductName> FetchRange(int startIndex, int count)
{
return _query.Skip(startIndex).Take(count).ToList();
}
}
我设法测量的唯一代码是viewmodel中的代码,我知道它足够快,有没有办法测量和评估更新GUI所需的其余时间?