2

仮想化していない 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 をオフにしました。まだ仮想化はありません。

私は何が欠けていますか?

4

1 に答える 1

2

エキスパンダー内にあり、エキスパンダーのテンプレートはヘッダー付きコンテンツコントロールであり(私が覚えている限り)、テンプレートにはスタックパネルが含まれているため、仮想化されていません。

stackpanelのコンテンツは、スタックしている方向に整列ストレッチすることはできません。そのため、リストボックスには常に必要なすべてのスペースがあり、仮想化は行われません。内側のリストボックスにも垂直スクロールバーは表示されません。

あなたには1つの解決策があります(少なくとも:)

1:内側のリストボックスにmaxheightを設定します-おそらく最も簡単です。

それが役に立てば幸い :)

于 2012-09-24T19:47:40.717 に答える