J'ai un ItemsControl
contenant une liste de données que je voudrais virtualiser, mais VirtualizingStackPanel.IsVirtualizing="True"
ne semble pas fonctionner avec un fichier ItemsControl
.
Est-ce vraiment le cas ou y a-t-il une autre façon de le faire dont je ne suis pas au courant?
Pour tester, j'ai utilisé le bloc de code suivant:
<ItemsControl ItemsSource="{Binding Path=AccountViews.Tables[0]}"
VirtualizingStackPanel.IsVirtualizing="True">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Initialized="TextBlock_Initialized"
Margin="5,50,5,50" Text="{Binding Path=Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Si je change le ItemsControl
en a ListBox
, je peux voir que l' Initialized
événement ne s'exécute qu'une poignée de fois (les marges énormes sont juste pour que je n'ai qu'à parcourir quelques enregistrements), mais ItemsControl
chaque élément est initialisé.
J'ai essayé de régler le ItemsControlPanelTemplate
sur a VirtualizingStackPanel
mais cela ne semble pas aider.
ItemsControl
enScrollViewer
instread ajoutantScroll
àControlTemplate
?En vous basant sur la réponse de DavidN, voici un style que vous pouvez utiliser sur un ItemsControl pour le virtualiser:
Je n'aime pas la suggestion d'utiliser un ListBox car ils permettent la sélection de lignes là où vous ne le souhaitez pas nécessairement.
la source
C'est juste que la valeur par défaut
ItemsPanel
n'est pas unVirtualizingStackPanel
. Vous devez le changer:la source