J'affiche une collection d'images dans un LongListSelector sur WP8 et j'ai mis en œuvre la fonction modèle de chargement paresseux bien connu en utilisant l'événement ItemRealized de LLS.
Dans le code ci-dessous, OnItemRealized est appelé pour chaque élément de la collection d'images, même pour les éléments qui sont clairement hors écran. Dans ce scénario, 24 éléments tiennent à l'écran, mais le LLS en réalise 40, ce qui déclenche la fonction ResumeGetPictures() du ViewModel. Lorsque la collection d'images change (INotifyCollectionChanged), le LLS réalise également ces éléments jusqu'à ce qu'il n'en ait plus, ce qui déclenche la prochaine ResumeGetPictures() - et ce jusqu'à ce que le ViewModel soit incapable de charger d'autres éléments.
Tout semble bien se passer tant que le LLS est en LayoutMode=List. Mais lorsque je passe en mode Grille, le contrôle semble avaler chaque élément de la liste et le réaliser immédiatement. Ce qui rend impossible toute forme de chargement paresseux.
J'espère que j'ai juste fait quelque chose de très très mal - bien que j'en doute parce que j'ai tout vérifié trois fois et comme je l'ai dit, passer à "Liste" résout le problème immédiatement - malheureusement pas une option pour une galerie de photos de quelque sorte.
ViewModel :
public IReactiveDerivedList<TPicture> Pictures
{
get { return pictures; }
}
Voir le Code-Behind :
lls.ItemRealized += OnItemRealized;
private void OnItemRealized(object sender, ItemRealizationEventArgs e)
{
var picture = e.Container.Content as Picture;
if (picture != null)
{
// get index
var pictureIndex = lls.ItemsSource.IndexOf(picture);
if (pictureIndex >= lls.ItemsSource.Count * 0.95f)
ViewModel.ResumeGetPictures();
}
}
XAML :
<phone:LongListSelector Name="lls" Margin="13,-30,0,0"
ItemsSource="{Binding Pictures}"
Tap="OnListItemTapped"
ItemTemplate="{StaticResource ItemTemplate}"
IsGroupingEnabled="False"
LayoutMode="Grid"
GridCellSize="108,108"/>