我正在为我的应用程序构建一个搜索功能,其中匹配产品列表应在每次击键时更新,但它太慢了,奇怪的是 GUI 中的实际更新时间比检索所需的时间长得多数据库中的匹配产品。
为了避免在列表中缓慢滚动,我正在使用此处描述的虚拟化:http: //www.codeproject.com/Articles/34405/WPF-Data-Virtualization,滚动现在非常顺利,但更新列表需要很多秒对于大约 30000 个产品,编写第 4 个字母(然后生成 <100 个产品)与编写第一个字母时一样慢。
代码类似于 codeproject 一,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>
视图模型:
private VirtualizingCollection<ProductName> productNames;
public VirtualizingCollection<ProductName> ProductNames
{
get
{
if(productNames == null)
productNames = new VirtualizingCollection<ProductName>(new ProductNameProvider(ProductNamesQuery()),100);
return productNames;
}
}
我的产品名称提供商:
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();
}
}
我设法测量的唯一代码是视图模型中的代码,我知道这已经足够快了,有没有办法测量和评估更新 GUI 所需的剩余时间?