2008-10-02 11 views
1

Pour ceux d'entre vous qui aiment les puzzles: J'ai eu ce problème récemment et je suis sûr qu'il doit y avoir une meilleure solution.WPF Lier à une collection d'objets, triés par ID stockés dans l'ordre dans une autre collection en C#

Tenir compte:

  • ObservableCollection de objets Foo appelé foos.
  • Foo contient un champ d'ID de chaîne
  • Je ne contrôle pas foos
  • Foos va changer

Puis:

  • J'ai une autre collection appelée sortLikeThis
  • sortListThis contient des chaînes
  • Les chaînes sont les ID dans l'ordre dans lequel les foos doivent être affichés

Plus:

  • Il peut y avoir des objets dans foos avec un ID qui n'est pas dans sortLikeCeci est. Ceux-ci doivent aller à la fin.
  • De même, il peut y avoir des chaînes dans sortLikeCe n'apparaît pas dans foos.

est-il un moyen agréable de se lier et montrer à WPF les objets Foo dans foos dans l'ordre défini par ID dans sortLikeThis?

Merci, Lee.

Répondre

2

Cela ressemble à un travail pour une collection observable personnalisée qui implémente IEnumerable et possède un petit petit énumérateur (aaah, yield) qui gère la logique du tri personnalisé.

public class SortFoosLolThx : ObservableCollection<Foo> { 
public IList<string> SortList {/*...*/} 
/*...*/ 
public override IEnumerator<Foo> GetEnumerator() { /*...*/ yield foo; /*...*/} 
} 
+0

Salut Will, Je ne suis pas sûr que cette solution fonctionne: 1. Je n'ai pas de contrôle sur le ObservableCollection ** foos ** - donc en particulier, ne peut pas le transformer en un sortable. 2. Qu'est-ce qui déclencherait un appel à SortList si la collection était modifiée? Lee –

2

Avez-vous regardé Bindable LINQ? Il vous permet de définir des requêtes LINQ au-dessus d'une collection observable et de vérifier que la requête LINQ est exécutée chaque fois que la collection sous-jacente est modifiée. Dans votre cas, vous pouvez ajouter une requête Orderby au-dessus de la collection.

Vous pouvez transmettre à la méthode Orderby un délégué pour effectuer la comparaison.Pour configurer cela vous

  1. Préparer en créant un mappage Dictionnaire chaque id dans sortLikeThis à un ascendant int
  2. Dans le délégué de comparaison, la recherche dans le dictionnaire les IDs des deux foos qui sont passés à titre de comparaison. Faites la chose appropriée si un élément ne peut pas être trouvé.