2009-09-24 10 views
1

Je crée un menu dont les éléments de menu seront injectés à partir de différents modules (j'utilise la bibliothèque d'applications composites: Unity, Prism).Comment trier les données hiérarchiques dans WPF?

Exemple:

 
File 
- Open 
- New 
    - A (injected from ModuleA) 
    - B (injected from ModuleB) 
    - C (injected from ModuleC) 
- Exit 

Parce que je ne sais pas quels éléments seront injectés, je besoin de trier mes articles en quelque sorte de menu. J'essaye de faire ceci maintenant en créant un classéMenuItem qui hérite de MenuItem. ClasséMenuItem a une propriété supplémentaire, Rank, qui est un entier.

Je définis l'élément de menu "File -> Exit" comme étant 1000 et "File -> Open" comme rang 0, de sorte que Exit apparaîtra toujours au bas du menu File, et Open will toujours apparaître en haut. Le problème que j'ai est que Je ne peux pas comprendre la meilleure façon de trier la hiérarchie de menu. Je peux trier le plus haut niveau facilement en utilisant un CollectionView, mais je n'arrive pas à comprendre comment l'appliquer aux sous-éléments.

Un conseil serait grandement apprécié.

Répondre

2

Par défaut, MenuItem.ItemsSource peut contenir n'importe quel ensemble basé sur une collection. Cela peut être une liste triée, par exemple, ou une collectionviewsource. Si les éléments de la collection sont spécifiques à un domaine (par exemple, les objets MenuItem), votre tâche peut être moins que triviale. Sur la base de votre description, il semble que vos modules enregistrent un simple objet MenuItem directement dans les éléments du "Nouveau" MenuItem, ce qui rend impossible le tri. Si c'est le cas, ma suggestion est d'avoir quelque chose comme ObversableCollection avec lequel les éléments sont ajoutés/supprimés via, et l'utiliser via un CollectionViewSource attaché à la propriété MenuItems de l'élément de menu "New". Cela devrait vous permettre de trier les éléments de menu ajoutés dynamiquement par d'autres modules (cependant, la façon dont vous implémentez le tri dépend de vous, par exemple en exigeant un classéMenuItem des modules, ou vous pouvez simplement trier par ordre alphabétique avec une pondération spécifique au produit certains éléments de menu sont toujours triés au-dessus/en dessous d'autres éléments de menu «connus».)

Espérons que cela vous aide.

+0

Nous avons implémenté notre solution de manière similaire. Désolé pour l'acceptation tardive. –

Questions connexes