1

C# WPF アプリケーションにa がありListViewます。GridViewはからで作成された にItemsSourceバインドされます。動的な並べ替え、フィルタリング、およびグループ化に を使用します。これらはすべて、 から調整またはオン/オフを切り替えることができます。ListCollectionViewViewModelObservableCollection<MyClass>ListCollectionViewView

フィルターを変更したり、グループ化のオン/オフを切り替えたりすると、すべてのビジュアル リスト ビュー アイテムが再作成され、UI が約 1 秒間フリーズします。約 250 の項目が表示され、約 10 の列 (プログレスバー付きのセル テンプレートがあるものもあります) があるので、これは当然のことです。

これで、明らかな答えは仮想化を有効にすることだとわかりました。ただし、これにより、スクロールがぎくしゃくしたり、スクロールするとスクロールバーのサイズが変化したりするなど、望ましくない影響が生じます (これは、グループ化をオンにした場合に発生します。これは、グループの高さが異なり、仮想化スタック パネルが合計の高さを適切に計算できないためです)。初めに)。

私がやりたいことはListView、生のリスト内のすべてのアイテムのビジュアル要素を保持し (フィルタリングもソートもされていない、つまりObservableCollection<MyClass>)、変更に応じてビジュアル ツリーにのみ追加または削除することです。ListCollectionView.

生のリストを変更することはめったにありませんが、フィルタリング、並べ替え、およびグループ化を頻繁に変更するため、このソリューションがアプリのパフォーマンスを向上させることを願っています。

ListViewこれを行うには(または)から継承するカスタム コントロールを作成する必要がありますGridViewか、それとも別の方法がありますか?

4

1 に答える 1

1

DeferRefresh を使用してみてください。これは、遅延サイクルが存在するまで自動更新を遅らせます。それが役立つかどうかを確認してください。

CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(SomeListView.ItemsSource);
using (view.DeferRefresh())
{
  view.GroupDescriptions.Clear();
  view.GroupDescriptions.Add(new PropertyGroupDescription("Country"));
  view.GroupDescriptions.Add(new PropertyGroupDescription("Active"));
}

http://blogs.msdn.com/b/matt/archive/2008/08/28/collectionview-deferrefresh-my-new-best-friend.aspx

于 2015-09-18T10:11:13.083 に答える