2009-12-16 2 views
4

Je suis en train d'afficher un ensemble de données à l'aide d'un DataTemplate dans un ItemsControl, avec l'ensemble ItemsPanel comme une grille uniforme de taille 3 x 3. La ItemsSource du ItemsControl est défini pour lier à un CollectionViewSource qui filtre la collection source en fonction d'un terme de recherche. Tout cela fonctionne très bien.WPF Comment fixer un montant maximal de résultats de CollectionViewSource

La liste que je suis se lier à est d'une taille arbitraire, mais je veux seulement 9 résultats à afficher, mais je ne peux pas pour la vie de me trouver comment soit:
a) limiter la CollectionViewSource à sortie les 9 premiers articles
b) limiter le UniformPanel à seulement 3 x 3 et ne jamais créer de nouvelles lignes
c) limiter le ItemsControl pour permettre seulement de créer 9 modèles de données à la fois.

Je me gratte vraiment la tête parce que je suis sûr que c'est un scénario commun de databinding mais je ne trouve rien sur le web à ce sujet.

+0

Basé sur la réponse de cwap, j'ai complètement abandonné CollectionViewSource et créé simplement une liste principale et une liste filtrée dans le modèle de vue, cette dernière étant mise à jour lorsque le terme de recherche change. Utiliser un convertisseur est une bonne idée et probablement plus "pure" MVVM que d'inclure le nombre maximum de sorties dans la VM (pourquoi je l'ai marqué comme réponse), mais pour l'instant je suis content de le faire dans la VM. Salutations pour les réponses tous. – Guy

Répondre

4

Deux solutions que je peux penser:

Si vous utilisez l'affichage modèle, mettre la logique là-dedans pour créer une propriété que vous pouvez lier à qui n'a jamais 9 éléments. Assurez-vous que l'unité est testée pour s'assurer que plus de 9 éléments ne se faufilent jamais dans la collection.

Sinon, vous pouvez utiliser un converter lors de la liaison de la source d'éléments pour convertir la liste complète à une liste réduite de la première 9.

+0

Il convient de souligner que l'approche du convertisseur empêche les événements de propagation de se propager. Si vous ajoutez ou supprimez de votre source de données liée, cela ne sera pas reflété. –

2

Ceci est juste une de ces choses que vous ne pouvez pas faire (encore) en XAML.

Vous pouvez créer un "CollectionViewSourceView" (: P), qui sera mis à jour chaque fois que CollectionViewSource est mis à jour, pour ne sortir que les 9 premiers éléments. Pourtant, cela va dans le codebehind (ou mieux, le viewmodel).

1

J'allais dire la même chose que James Hay (utiliser un convertisseur), mais Je voudrais également ajouter que vous pouvez databind un ConverterParameter dans le XAML pour spécifier dynamiquement combien d'éléments sont retournés.

Questions connexes