2009-09-18 4 views
0

J'ai cette situation où j'ai un ListBox qui est peuplé à partir d'un thread d'arrière-plan (c'est un carnet d'adresses et les données proviennent d'AD). Le problème est que puisque la liste est triée (en utilisant CollectionViewSource) et aussi disponible pour l'utilisateur pendant que plus de données sont récupérées, elle rebondit partout comme de nouveaux éléments sont insérés à divers endroits de la liste. Il est donc disponible pour l'utilisateur, mais en grande partie inutilisable puisque les sélections de l'utilisateur ne sont pas visibles.WPF: Obtenir une zone de liste pour rester mis

Y a-t-il un moyen de conserver Focus à l'élément sélectionné et de conserver la sélection, même si des éléments sont insérés au-dessus et au-dessous de la sélection à partir du fil d'arrière-plan? Je préférerais ne pas trier sur le serveur, ce que je comprends peut être une mauvaise chose quand il s'agit de AD.

+0

est-il possible de remplir la liste, puis commencer à travailler? Ou l'arrivée des données peut être à tout moment? – manji

+0

Idéalement (comme il est prévu) est qu'ils peuvent travailler sur les résultats partiels comme plus de résultats entrent en jeu. Je ne veux pas les faire attendre pendant potentiellement minutes pendant le remplissage d'une zone de liste. –

Répondre

0

Je vais répondre à cela d'une perspective de conception de l'interface utilisateur plutôt que d'un point de vue technique du code. (Je suis sûr que quelqu'un d'autre aura un moyen d'avoir la boîte de liste à la vue de l'élément sélectionné)

Je dirais que l'utilisation d'une zone de liste lors de l'ajout de grandes quantités de données est assez impossible faire bien. Disons simplement que vous l'obtenez pour garder la sélection en vue, et pendant que l'utilisateur est toujours à la recherche de l'élément requis, vous ne pourrez pas le garder quand même. Tout d'abord, si le temps de chargement total prévu est inférieur à 10 secondes, vous pouvez simplement désactiver la zone de liste jusqu'à ce que le chargement soit terminé. (Évidemment gris avec une animation tournante ou quelque chose de sorte que l'utilisateur peut voir qu'il fait quelque chose.) Je suppose que vous avez déjà rejeté cette option sinon vous ne seriez probablement pas demander ici. Mais je pense que cela vaut la peine d'être considéré. Si le temps de chargement est très petit, sachez que vos utilisateurs gagneront vraiment quelque chose en étant capables de parcourir la liste pendant qu'elle est encore en train d'être chargée. Deuxièmement, je proposerais que vous trouviez un moyen de restreindre le contenu de la zone de liste afin que seulement de petites quantités soient affichées toutes en même temps. Vous pouvez le faire en affichant uniquement des noms commençant par une seule lettre de l'alphabet (avec un contrôle de sélection de lettre). Ou vous pourriez fournir une zone de texte d'entrée de filtre en haut où l'utilisateur pourrait taper les premières lettres et la zone de liste n'afficherait que les noms commençant par ces lettres. Cela permettrait à l'utilisateur de taper "sa" et la liste afficherait "sam", "samantha", "sacha", etc. Maintenant vous avez seulement un petit nombre d'éléments dans la liste, donc vous n'avez pas à s'inquiéter à ce sujet en sautant. Si le nombre d'éléments dans la liste devient trop important (en raison du chargement sur le fil d'arrière-plan) et que la liste dépasse la hauteur de la boîte, l'utilisateur peut simplement taper une lettre supplémentaire pour filtrer la liste.

Désolé si ce n'est pas vraiment ce que vous vouliez, mais je pensais que cela valait la peine d'apporter une conception alternative au cas où vous l'auriez oublié.

+0

Merci. Je suis d'accord avec ce que vous dites, mais comment implémenteriez-vous personnellement un carnet d'adresses (pensez à un carnet d'adresses Exchange, bien que dans ce cas il provienne d'AD) avec des centaines de milliers d'entrées? Un carnet d'adresses de type Outlook aurait du sens. Il serait vraiment ennuyeux pour les gens d'avoir à sélectionner une lettre pour trouver le nom, normalement du point de vue de la conception de l'interface utilisateur, moins il y a de clics, mieux c'est. Et quand il s'agit de localisation, voulez-vous vraiment sélectionner un personnage japonais ou chinois sur 40 000+? –

+0

Pour continuer, j'ai un filtre implémenté, mais je veux qu'il filtre les données d'affichage. Cela atténue mais n'élimine pas le problème.Je ne veux pas qu'il retourne au serveur et provoque le transfert d'un nouvel ensemble de données. De plus, les temps de chargement varient de 15 secondes, selon la façon dont le serveur AD ressent ce moment. –

Questions connexes