Convertir une Liste<T> pour ObservableCollection<T> dans WP7
Je ne sais pas si c'est juste trop tard ou quoi, mais je ne vois pas comment faire...
Ce que je m'attends à faire, et que le navigateur d'objet est dit là, est-ce:
var oc = new ObservableCollection<T>( new List<T>() );
Mais ObservableCollection<T>
a un seul constructeur sans paramètre. Le navigateur d'objet dit il y a 2 surcharges où Liste et IEnuerable devrait être en mesure d'être passée dans.
Est-il quelque chose de mal avec ma configuration? Les constructeurs sont pas sur la version de téléphone? (ce qui serait étrange)
Si ce vraiment n'existe pas, ce qui est la façon standard de le faire avec WP7 maintenant?
Vous devez vous connecter pour publier un commentaire.
Les constructeurs
ObservableCollection<T>(IEnumerable<T>)
etObservableCollection<T>(List<T>)
ne sont pas pris en charge dans la note WP 7.0. Seul le constructeur sans paramètre est pris en charge dans la note WP 7.0. Les autres constructeurs sont disponibles dans Silverlight 4 et ci-dessus et WP 7.1 et au-dessus, tout simplement pas dans WP 7.0.Je suppose que votre seule option est de prendre votre liste et ajouter les éléments dans une nouvelle instance d'un
ObservableCollection
individuellement, comme il n'existe pas de méthodes facilement accessibles pour les ajouter en vrac. Si ce n'est pas pour vous empêcher de mettre cela dans une extension ou une méthode statique de vous-même.ObservableCollection a plusieurs constructeurs qui ont paramètre d'entrée de la Liste des<T> ou IEnumerable<T>:
List<T> list = new List<T>();
ObservableCollection<T> collection = new ObservableCollection<T>(list);
ObservableCollection
donné API du SDK. @eugène.sushilnikov peut gagner le Populiste badge 😉Pour convertir
List<T> list
de collection observable vous pouvez utiliser le code suivant:Vous devrez écrire votre propre méthode d'extension pour ce faire:
Méthode d'Extension de cette réponse IList<T> pour ObservableCollection<T> fonctionne assez bien
IEnumerable<TSource>.Each( Action<TSource, int> predicate )
Each
méthode, voir blogs.msdn.com/b/ericlippert/archive/2009/05/18/...Clearly the sole purpose of a call to this method is to cause side effects
. C'est tellement vrai. Je suis d'accord avec sa raison pourquoi elle ne devrait pas être là. C'est quelque chose que j'aime à utiliser, mais vous avez la possible fermeture de questions. Même avec Javascript si.Si vous allez ajouter beaucoup d'articles, de considérer découlant de votre propre classe de ObservableCollection et en ajoutant des éléments aux Éléments protégés par membre - ce ne sera pas déclencher des événements en qualité d'observateurs. Lorsque vous avez terminé, vous pouvez augmenter les événements appropriés:
Lors de l'ajout de nombreux éléments à une ObservableCollection qui est déjà lié à un élément d'INTERFACE utilisateur (comme le LongListSelector), cela peut faire une énorme différence en termes de performances.
Avant d'ajouter les éléments, vous pouvez également vous assurer d'avoir suffisamment d'espace, de sorte que la liste n'est pas continuellement élargi par la mise en œuvre de cette méthode dans le BulkObservableCollection de la classe et de l'appeler avant de faire appel à AddRange:
J'ai fait une extension alors maintenant, je peux juste charger une collection avec une liste en faisant:
L'extension est:
La réponse fournie par Zin Min résolu mon problème avec une seule ligne de code. Excellent!
J'ai eu le même problème de la conversion d'une Liste générique pour générique ObservableCollection pour utiliser les valeurs de ma Liste pour remplir un ComboBox qui participe à la liaison par l'intermédiaire d'une usine de classe pour une Fenêtre WPF.
_expediteStatuses = new ObservableCollection<ExpediteStatus>(_db.getExpediteStatuses());
Voici la signature de l'getExpediteStatuses méthode:
public List<ExpediteStatus> getExpediteStatuses()
Utiliser ceci: