仮想化していない ListBox があります。明らかに何かが欠けていますが、見つかりません。
これは、実際には ListBox 内の ListBox です。外側の ListBox には、Expander を含む ItemTemplate があります。Expander は、アイテムのグループを表示するために使用されます。Expander のコンテンツは、項目を表示する 2 番目の ListBox です。2 番目の ListBox の ItemTemplate は、表示する実際の Item にバインドされます。項目の ViewModel クラスには、プロパティ Get が呼び出されるまでデータを初期化しないプロパティが多数あります。ただし、WPF はすべてのアイテムをウォークスルーし、初期化ロジックを引き起こします。これは回避しようとしています。
ListCollectionView.GroupDescription を使用すると ListBox が仮想化されないことがわかりました。現在、ViewModel で独自のグループ化を処理しています。私の外側の ListBox は ObservableCollection(ItemGroupViewModel) にバインドされています。ここで、ItemGroupViewModel には GroupName とアイテムのリストがあります。2 番目の ListBox は、ItemGroupViewModel の項目にバインドされます。これで問題は解決しませんでした。デバッグ中に VirtualizingStackPanel.GetIsVirtualizing() もチェックしたところ、true が返されましたが、WPF はまだすべての項目を通過しています。グループ化ロジックが各アイテムのデータ初期化ロジックを起動しないように再確認しましたが、これを回避しようとしています。
列のサイズを決定するために、IsSharedSizeScope によって ListBox がすべての項目をレンダリングする可能性があると考えました。そこで、SharedSizeScope をオフにしました。まだ仮想化はありません。
私は何が欠けていますか?