2010-11-26 21 views
1

Je fais un UserControl où n'importe qui peut ajouter une liste.C#: Propriété de liste générique

En interne, cette liste est triée et les éléments ajoutés à un ItemaSource interne sont ajoutés par programmation.

Toute personne qui veut utiliser ce UserControl doit utiliser la propriété ElementsDataSource

public List<T> ElementsDataSource {get;set;} 

List<T> ne fonctionne pas/compilation, au lieu je dois utiliser List<object>.

Mais je dois jeter les objets à l'intérieur du ElementsDataSource à nouveau le type générique quand je les trier en interne et de les réutiliser, etc ...

Comment puis-je offrir une liste générique propriété à mon utilisateur tout comme. NET le fait?

Peut-être que mon utilisateur est plugin dans un List<Customer> ou List<Department> etc ... ou ai-je totalement tort et devrait utiliser List<Object>?

+2

s'il vous plaît soyez explicite: que voulez-vous dire «ne fonctionne pas/compiler»? –

Répondre

0

Notez que .NET utilise IEnumerable ou Object comme type d'une telle propriété. Il utilise ensuite la réflexion pour décider comment traiter les données. Au lieu de cela, vous pouvez demander à votre interlocuteur de faire un tri ou un filtrage, et vous fournir simplement un IEnumerable prêt à l'emploi.

Si vous devez pouvoir afficher une collection d'objets et que la collection doit être triée dans le contrôle, et que la collection doit avoir un ordre de tri "naturel", l'objet doit implémenter l'interface IComparable<T>. Vous pourriez alors découvrir ceci par la relection. Vous exigerez que la collection implémente à la fois IEnumerable<T> et IComparable<T> afin que vous puissiez faire un tri "naturel" sur les éléments de la collection.

+0

Hey John, pas le tri doit se produire dans le UserControl car l'utilisateur ne devrait pas se soucier de ce processus interne. Il suffit de brancher la liste à ElementsDataSource, les clients sont triés en fonction de leur sortid à afficher dans le UserControl dans le bon ordre! – Elisabeth

+1

Le tri serait normalement considéré comme un processus externe si le contrôle de l'utilisateur est destiné à l'affichage. Les contrôles doivent désactiver les données qui leur sont fournies, à moins qu'ils ne modifient l'ordre de tri en fonction de l'entrée de l'utilisateur: en cliquant sur un en-tête de grille, par exemple. Sinon, ils devraient simplement faire ce qu'on leur dit de faire. –

+0

Ne suis pas d'accord parce que => C'est un must-Feature ou une partie de ce contrôle pour afficher les "éléments" dans cet ordre, qu'ils ont été ajoutés/sauvegardés la dernière fois, les recharger à partir de la base de données. – Elisabeth

1
+0

Si ma classe est un UserControl qui ne fonctionnera pas: public partial class ElementsView : UserControl => erreur et je ne peux pas déclarer dans xaml ;-) – Elisabeth

1

Si vous ne voulez pas faire la classe de contrôle générique (ceci est votre solution List<T>) alors peut-être que vous devriez essayer d'utiliser List<ISomeInterface> que toutes les classes utilisées avec ce contrôle à mettre en œuvre?