次のようなアイテムテンプレートを含むリストボックスがあるページがあります。
<ListBox x:Name="test">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid MaxHeight="108" Margin="0,0,0,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="4" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Rectangle Height="108" Grid.Column="0" Fill="{Binding Color}"/>
<Image Source="{Binding Image}" Height="108" Width="108" Grid.Column="1" HorizontalAlignment="Left" Stretch="UniformToFill"/>
<StackPanel Grid.Column="2">
<TextBlock Text="{Binding Title}" TextWrapping="NoWrap" />
<TextBlock Text="{Binding SubHeading}" TextWrapping="NoWrap" />
<TextBlock Text="{Binding Body}" TextWrapping="Wrap" />
</StackPanel>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
このページのOnNavigatedToイベントで、リストボックスのアイテムソースを約20個のアイテムの監視可能なコレクションに設定しました。
すべてが順調で、リストにデータが入力されていますが、リストを上下にスクロールすると、UIでアイテムが同期していないように見えます。たとえば、最初のリストアイテムに表示されたテキストは、リストボックスの最後のアイテムに表示され、重複する場合があり、アイテムを上下にスワイプするたびに異なります。
リストボックスアイテムをデバッグしましたが、正しいオブジェクトが適切なアイテムにバインドされていることがわかります。したがって、UIに表示されるのは正しくないことだけです。
また、virtualizationstackpanelではなく、標準のstackpanelを明示的に使用してみました。これは、すべてのアイテムがメモリにロードされていることを確認することで問題を回避します。
仮想化を削除することが答えだとは思いません。根本的な原因があるはずです。ただし、リストボックスに実際に30を超えるアイテムが含まれることはないため、許容できる場合があります。
別のページで、silverlightツールキットのlonglistselectorを使用して同じことを行い、同じ問題が発生します。ただし、longlistselectorで仮想化を削除する方法がわかりません。
要約すると、スクロール時にリストボックスアイテムがUIを適切に更新しない原因となる根本的な問題は何でしょうか。仮想化を削除することが唯一の答えである場合、longlistselectorでこれを行うにはどうすればよいですか?
これについて助けてくれてありがとう。