Cómo usar la virtualización de la interfaz de usuario con plantillas ListBox redefinidas

Estoy tratando de usar ListBox como una vista que contiene varios elementos y, por supuesto, necesito usar la virtualización de la interfaz de usuario.

El problema es que la virtualización funciona solo cuando declaro ListBox de esta manera:

<ListBox 
    ItemsSource="{Binding ItemsSource}" 
    VirtualizingStackPanel.IsVirtualizing="True"
    VirtualizingStackPanel.VirtualizationMode="Recycling">

    <ListBox.ItemTemplate>
        <DataTemplate>
            <views:SiteEntryView />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Pero si trato de personalizarlo, ya no se virtualiza:

<ListBox 
    ItemsSource="{Binding ItemsSource}" 
    VirtualizingStackPanel.IsVirtualizing="True"
    VirtualizingStackPanel.VirtualizationMode="Recycling">

    <ListBox.Template>
        <ControlTemplate>
            <ScrollViewer>
                <ItemsPresenter />
            </ScrollViewer>
        </ControlTemplate>
    </ListBox.Template>

    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

    <ListBox.ItemTemplate>
        <DataTemplate>
            <views:SiteEntryView />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Por lo que he encontrado, esta muestra contiene exactamente lo mismo que ListBox contiene de forma predeterminada. Pero la virtualización no está funcionando. He leído varios artículos y también un par de respuestas aquí, pero todavía no puedo entender la "forma general": ¿qué y dónde debo configurar, vincular, agregar, etc. para que la virtualización funcione con plantillas personalizadas?

Respuestas a la pregunta(2)

Su respuesta a la pregunta