1

我正在为我的应用程序构建一个搜索功能,其中匹配产品列表应在每次​​击键时更新,但它太慢了,奇怪的是 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 所需的剩余时间?

4

0 回答 0