comment trier ObservableCollection
J'ai une ObservableCollection et WPF UserControl est lié aux données. Le Contrôle est un graphique qui montre une barre verticale pour chaque élément de type BarData dans l'ObservableCollection.
ObservableCollection<BarData>
class BarData
{
public DateTime StartDate {get; set;}
public double MoneySpent {get; set;}
public double TotalMoneySpentTillThisBar {get; set;}
}
Maintenant, je veux sortir de la ObservableCollection basé sur la date de début, de sorte que le BarData seront en ordre croissant de date de début de la collection.
Ensuite, je peux calculer les valeurs de TotalMoneySpentTillThisBar dans chaque BarData comme celui -
var collection = new ObservableCollection<BarData>();
//add few BarData objects to collection
collection.Sort(bar => bar.StartData); //this is ideally the kind of function I was looking for which does not exist
double total = 0.0;
collection.ToList().ForEach(bar => {
bar.TotalMoneySpentTillThisBar = total + bar.MoneySpent;
total = bar.TotalMoneySpentTillThisBar;
}
);
Je sais que je peux utiliser ICollectionView pour trier, filtrer les données pour veiwing mais cela ne change pas la perception. J'ai besoin de trier la collection réelle afin que je puisse calculer TotalMoneySpentTillThisBar pour chaque élément. Sa valeur dépend de l'ordre des éléments dans la colection.
Grâce.
source d'informationauteur Souvik Basu
Vous devez vous connecter pour publier un commentaire.
hummm première question que j'ai pour vous est:
est-il vraiment important que votre
ObservableCollection
est trié, ou est-ce que vous voulez vraiment est d'avoir l'affichage graphique de la triés?Je suppose que le but est d'avoir une triés affichage qui sera mis à jour en "temps réel". Alors je vois 2 solutions
obtenir le
ICollectionView
de votreObservableCollection
et à les trier, comme expliqué icihttp://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/
lier votre
ObservableCollection
à unCollectionViewsource
ajouter un tri sur elle, puis utiliser cetteCollectionViewSource
comme leItemSource
d'unListView
.je.e:
ajouter cet espace de noms
puis
et lier comme ce
Je viens de créer une classe qui étend la
ObservableCollection
parce qu'avec le temps j'ai voulu aussi d'autres fonctionnalités que je suis habitué à l'aide d'unList
(Contains
IndexOf
AddRange
RemoveRange
etc)J'ai l'habitude de l'utiliser avec quelque chose comme
MyCollection.Sort(p => p.Name);
Voici mon tri de la mise en œuvre
Le problème avec le tri ObservableCollection, c'est que chaque fois que vous changez la collection, un tournoi sera tiré. Donc, pour un tri qui est de la suppression d'éléments à partir d'une position et en les ajoutant à un autre, vous finirez par avoir une tonne d'événements de tir.
Je pense que vous êtes le mieux est de simplement insérer des trucs dans le ObservableCollection dans le bon ordre pour commencer. Suppression d'éléments de la collection ne sera pas l'effet de la commande. Je fouettée jusqu'à une rapide extension de la méthode pour illustrer
Donc, si vous utilisez une chaîne de caractères (par exemple), le code ressemblera à ceci
Modifier
Vous pouvez garder les appels à l'identique si vous étendez la ObservableCollection et de fournir votre propre insérer/ajouter des méthodes. Quelque chose comme ceci:
L'insertion d'index est ignoré.
Ce sujet de trier les données en utilisant LINQ sur les différents collection:
Cela a fonctionné pour moi.
Également à l'aide de LINQ/Extensionmethod on peut éviter le tir de l'NotifyPropertyChanged Événement en ne définissant pas la source col de la triés, mais clairement l'origine et ajouter les éléments de la triés. (cela va continuer feu de l'Événement Collectionchanged, si mis en œuvre).