C# WPF アプリケーションにa がありListView
ます。GridView
はからで作成された にItemsSource
バインドされます。動的な並べ替え、フィルタリング、およびグループ化に を使用します。これらはすべて、 から調整またはオン/オフを切り替えることができます。ListCollectionView
ViewModel
ObservableCollection<MyClass>
ListCollectionView
View
フィルターを変更したり、グループ化のオン/オフを切り替えたりすると、すべてのビジュアル リスト ビュー アイテムが再作成され、UI が約 1 秒間フリーズします。約 250 の項目が表示され、約 10 の列 (プログレスバー付きのセル テンプレートがあるものもあります) があるので、これは当然のことです。
これで、明らかな答えは仮想化を有効にすることだとわかりました。ただし、これにより、スクロールがぎくしゃくしたり、スクロールするとスクロールバーのサイズが変化したりするなど、望ましくない影響が生じます (これは、グループ化をオンにした場合に発生します。これは、グループの高さが異なり、仮想化スタック パネルが合計の高さを適切に計算できないためです)。初めに)。
私がやりたいことはListView
、生のリスト内のすべてのアイテムのビジュアル要素を保持し (フィルタリングもソートもされていない、つまりObservableCollection<MyClass>
)、変更に応じてビジュアル ツリーにのみ追加または削除することです。ListCollectionView
.
生のリストを変更することはめったにありませんが、フィルタリング、並べ替え、およびグループ化を頻繁に変更するため、このソリューションがアプリのパフォーマンスを向上させることを願っています。
ListView
これを行うには(または)から継承するカスタム コントロールを作成する必要がありますGridView
か、それとも別の方法がありますか?