2012-10-15 5 views
3

J'ai créé une page de recherche dans une application Windows 8 Style. J'ai implémenté ISupportIncrementalLoading et quand l'utilisateur fait défiler la pagination fonctionne très bien.Effacement ISupportIncrementalLoading

Le problème que j'ai est quand un utilisateur fait une deuxième recherche. Je ne sais apparemment pas comment lancer le LoadMoreItemsAsync. J'ai essayé ce qui suit:

1) Effacez la collection sous-jacente qui est observable et prend en charge ISupportIncrementalLoading. Cela efface tous les éléments de l'écran pour que je sache qu'il est correctement lié.

2) Remplacez complètement l'instance de collection sous-jacente qui implémente ISupportIncrementalLoading et augmente INotifyPropertyChanged pour que la vue sache que la propriété a été modifiée. Cela efface également tous les éléments de l'écran. Toutefois, LoadMoreItemsAsync ne souhaite pas se déclencher après l'effacement ou le remplacement de l'instance de collection sous-jacente. Mon intuition est que l'interface utilisateur ne pense pas qu'elle a besoin de charger plus, mais depuis que j'ai effacé tous les éléments, elle devrait vouloir charger plus.

J'ai vérifié que la propriété HasMoreItems est définie sur true.

Si cela peut aider, malheureusement, vous pouvez voir l'erreur en production si vous téléchargez FlixPicks à partir du Windows 8 Store. Les étapes pour reproduire sont:

  1. Recherche par contrat fenêtres de recherche
  2. échange d'avis œuvres de la page de recherche
  3. Recherche supplémentaire.
  4. Notez que tous les éléments sont désactivés. (À ce stade, le LoadMoreItemsAsync ne déclenche pas)

Merci pour tout conseil que vous pouvez fournir!

+0

Je viens de créer une repro qui semble fonctionner correctement. C'est très simple, alors quelque chose est probablement perdu là-bas. Pouvez-vous jeter un coup d'oeil et essayer de voir ce qui est différent? https://www.box.com/s/ddr8138khigwe6n78i4b –

+0

Salut Shahar, Merci beaucoup pour l'échantillon. Votre échantillon fonctionne très bien. Je l'ai ajusté un peu pour que ça ne marche plus. J'utilise un GridView au lieu d'une vue de liste et j'ai ajusté la largeur de chaque élément.Si vous voulez bien, pourriez-vous jeter un coup d'œil à la base de code ajustée. Afin de reproduire vous ne faites pas défiler du tout, vous devez être tout le chemin vers la gauche, puis appuyez sur passer ou effacer. Si vous faites défiler vers la droite, cela fonctionne. https://www.box.com/s/9oe4miksi4yeyhat6rwo Merci encore! – Thomas

+0

Résolu - voir la réponse. –

Répondre

1

Cela ressemble vraiment à un bug. Pour résoudre ce problème, ajoutez la ligne suivante après la réinitialisation de votre collection (dans l'un des cas):

gv.LoadMoreItemsAsync(); 

Vous pouvez probablement hériter du contrôle et créer des remplacements qui le fera automatiquement:

+0

Merci. Techniquement, cela fonctionne mais crée un désordre lorsque vous utilisez un ViewModel parce que je n'ai pas un accès direct aux deux contrôles qui se lient à la collection. Je l'ai piraté pour le moment. Je passe une Action à mon ViewModel qui est appelée dans le modèle de vue, puis l'Action a accès aux contrôles. J'ai aussi dû faire face à un autre problème. Je recevais une exception dans certains cas. Semble comme un problème de synchronisation. Pour l'instant, j'attends juste 1 seconde et s'il n'y a pas encore de résultats, je force l'appel à LoadMoreItemsAsync. J'ai ajouté une nouvelle tentative autour d'elle juste au cas où 1 seconde ne suffisait pas. Pouah. – Thomas

+0

Une de ces corrections "J'ai besoin de douche". La fixation dans le contrôle peut être meilleure. Je vais regarder quand/si j'ai le temps et le mettre sur mon blog/ici. –

0

Je sais C'est un problème plus ancien, mais je l'ai également rencontré et je pensais que d'autres pourraient bénéficier d'une approche MVVM pour le résoudre. Ma solution a été, après avoir réinitialisé la collection, charger un seul élément dans la collection.

private async Task ResetCollectionAsync() 
{ 
    Clear(); 
    await LoadMoreItemsAsync(1); 
} 

La collection est vidée et un seul article est rajouté. Le contrôle GridView/ListView détecte l'événement CollectionChanged et re-requêtes HasMoreItems pour déterminer si charger des données supplémentaires.

Ce comportement est généré dans IncrementalLoadingCollection (v1.0.1), qui prend également en charge la fonctionnalité de filtrage et de tri hors de la zone.