3 votes

Filtrer une GridView sous Windows 8

J'ai actuellement une GridView dont le ItemsSource est défini sur une ObservableCollection. Les mises à jour des données sous-jacentes sont reflétées dans l'interface utilisateur sans aucun effort de ma part. Les choses fonctionnent bien.

Quelle est la manière la plus propre d'appliquer un filtre à la collection observable afin que seuls certains éléments soient affichés ? Idéalement, je ne veux pas supprimer d'éléments de la ObservableCollection, et je ne veux pas non plus maintenir deux collections distinctes, car cela rendrait la synchronisation plus difficile. CollectionViewSource semblait prometteur mais l'implémentation de Windows Store App semble manquer de capacité de filtrage (pourquoi MS ????).

1voto

HappyNomad Points 1823

Je viens juste d'être confronté à ce même problème dans ma propre application Windows 8 en C# + XAML. N'importe lequel de ces trois projets open-source vous donnera la fonctionnalité que vous recherchez : LINQ liant , Obtics et LINQ en continu .

C'est une bonne chose que CollectionViewSource n'inclue pas la fonctionnalité de filtrage dans Windows 8, puisqu'il est de toute façon préférable d'intégrer cette fonctionnalité dans le modèle de vue. Le principal avantage de cette solution est que, présenté sous la forme d'une bibliothèque de classes portable (PCL), votre modèle de vue (y compris le filtrage) sera alors portable dans tous vos projets WPF, Silverlight et Windows 8.

Bien que les trois projets open source mentionnés ci-dessus m'aient semblé intéressants, j'ai accompli cette tâche en construisant sur ma propre base Cadre MVVM . Mon cadre prend déjà en charge le tri, le filtrage était donc un ajout naturel. Il a été facile de l'ajouter en utilisant la fonction API réactive que j'ai mis en œuvre le mois dernier. Je n'ai pas encore téléchargé la dernière version de mon framework MVVM qui inclut le filtrage. Faites-moi savoir si aucun des trois projets open source ci-dessus ne vous convient, afin que je puisse les mettre en ligne un peu plus tôt.

0voto

danielrozo Points 1442

En supposant que vous utilisiez une sorte de MVVM des modèles, en utilisant LINQ :

this.DefaultViewModel["GreaterThan10Items"] = originalList.Where(c => c.SomeProperty > 10)
    .Select(c => new {c.SomeProperty, c.OtherProperty});

Ou peut-être :

this.DefaultViewModel["Children"] = from query in originalList
                                     where query.age <10
                                     select new Person
                                     {
                                      age= query.age,
                                      name = query.Name
                                     };

Bien entendu, la source ItemViewSource doit être liée à GreaterThan10Items et votre GridView doit être liée à cette source ItemViewSource.

0voto

Vous pouvez utiliser mon Calculs observables bibliothèque. Par exemple, si vous voulez filtrer les commandes d'un type spécifique dans GridView :

GridView.ItemsSource = OrdersObservableCollection
    .Filtering(o => o.Type == OrdersFilter.SelectedType)

Désormais, le GridView est automatiquement actualisé lorsque la collection OrdersObservableCollection est modifiée ou que la propriété Order.Type est modifiée. Assurez-vous que la classe Oreder implémente INotifyPropertyChanged.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X