一致する製品のリストがキーストロークごとに更新されるアプリケーションの検索機能を構築していますが、遅すぎて奇妙なことに、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の更新にかかる残りの時間を測定および評価する方法はありますか?