如何对 ObservableCollection 进行排序
我有一个 ObservableCollection 和一个 WPF UserControl 与其进行数据绑定。 Control 是一个图表,显示 ObservableCollection 中 BarData 类型的每个项目的垂直条。
ObservableCollection<BarData>
class BarData
{
public DateTime StartDate {get; set;}
public double MoneySpent {get; set;}
public double TotalMoneySpentTillThisBar {get; set;}
}
现在我想根据 StartDate 对 ObservableCollection 进行排序,以便 BarData 在集合中按 StartDate 的递增顺序排列。 然后我可以像这样计算每个 BarData 中的 TotalMoneySpentTillThisBar 的值 -
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;
}
);
我知道我可以使用 ICollectionView 来排序、过滤数据以进行查看,但这不会改变实际的集合。我需要对实际集合进行排序,以便可以计算每个项目的 TotalMoneySpentTillThisBar。它的价值取决于集合中项目的顺序。
谢谢。
I have a an ObservableCollection and a WPF UserControl is Databound to it. The Control is a graph that shows a vertical bar for each item of type BarData in the ObservableCollection.
ObservableCollection<BarData>
class BarData
{
public DateTime StartDate {get; set;}
public double MoneySpent {get; set;}
public double TotalMoneySpentTillThisBar {get; set;}
}
Now I want to sort out the ObservableCollection based on StartDate so that the BarData's will be in increasing order of StartDate in the collection.
Then I can calculate values of TotalMoneySpentTillThisBar in each BarData like this -
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;
}
);
I know I can use ICollectionView to sort, filter data for veiwing but that does not change the actual collection. I need to sort the actual collection so that I can calculate TotalMoneySpentTillThisBar for each item. Its value depends on order of items in colection.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
嗯,我要问你的第一个问题是:
ObservableCollection
排序真的很重要,还是您真正想要的是 GUI 中的显示排序?我假设目标是有一个将“实时”更新的排序显示。然后我看到 2 个解决方案
获取
ObservableCollection
的ICollectionView
并对其进行排序,如此处所述http://marlongrech.wordpress.com/2008/11/22/icollectionview-解释/
将您的
ObservableCollection
绑定到CollectionViewsource
,添加排序然后使用该CollectionViewSource
作为ListView
的ItemSource
。即:
添加此名称空间
然后
并像这样绑定
hummm first question I have for you is:
is it really important that your
ObservableCollection
is sorted, or is what you really want is to have the display in GUI sorted?I assume that the aim is to have a sorted display that will be updated "real time". Then I see 2 solutions
get the
ICollectionView
of yourObservableCollection
and sort it, as explained herehttp://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/
bind your
ObservableCollection
to aCollectionViewsource
, add a sort on it, then use thatCollectionViewSource
as theItemSource
of aListView
.i.e:
add this namespace
then
and bind like this
我刚刚创建了一个扩展
ObservableCollection
的类,因为随着时间的推移,我还想要使用我习惯从List
使用的其他功能(Contains、
IndexOf
、AddRange
、RemoveRange
等)我通常将它与
MyCollection.Sort(p =>; p.Name);
这是我的排序实现
I just created a class that extends the
ObservableCollection
because over time I've also wanted other functionality that I'm used to using from aList
(Contains
,IndexOf
,AddRange
,RemoveRange
, etc)I usually use it with something like
MyCollection.Sort(p => p.Name);
Here's my sort implementation
对 ObservableCollection 进行排序的问题是,每次更改集合时,都会触发一个事件。因此,对于从一个位置删除项目并将其添加到另一个位置的排序,您最终将触发大量事件。
我认为你最好的选择就是首先以正确的顺序将内容插入 ObservableCollection 中。从集合中删除项目不会影响排序。我提出了一个快速扩展方法来说明
因此,如果您要使用字符串(例如),代码将如下所示
编辑
如果您扩展 ObservableCollection 并提供您自己的,则可以保持调用相同插入/添加方法。像这样的事情:
插入索引被忽略。
The problem with sorting an ObservableCollection is that every time you change the collection, an event will get fired off. So for a sort that is removing items from one position and adding them to another, you will end up having a ton of events firing.
I think you're best bet is to just insert the stuff into the ObservableCollection in the proper order to begin with. Removing items from the collection won't effect ordering. I whipped up a quick extension method to illustrate
So if you were to use strings (for instance), the code would look like this
Edit
You can keep the calls identical if you extend the ObservableCollection and supply your own insert/add methods. Something like this:
The insert index is ignored.
如何在不同的集合上使用 LINQ 对数据进行排序:
这对我有用。
What about sorting the data using LINQ on the different collection:
This worked for me.
另外,使用 LINQ/Extension 方法,可以通过不将源列设置为已排序列,而是清除原始列并添加已排序列的项目来避免触发 NotifyPropertyChanged 事件。 (如果实现的话,这将继续触发 Collectionchanged 事件)。
Also using LINQ/Extensionmethod one can aviod firing the NotifyPropertyChanged Event by not setting the source col to the sorted one, but clear the original and add the items of the sorted one. (this will continue fire the Collectionchanged Event, if implemented).
我知道这是旧帖子,但我对大多数解决方案不满意,因为它破坏了绑定。所以如果有人遇到,这就是我所做的。您可以进行更多重载以进行更多属性排序。
这不会破坏绑定。
及用法:
I know this is old post, but I was unhappy with most of the solutions, because it broke bindings. So if anyone comes across, this is what I did. You can make more overloads for more property sortings.
This doesnt break binding.
And usage:
我正在使用 VMMV 模型。您可以将此代码添加到事件或 btn 或其他内容中。它通过参数 (int,string...)-sortVar 对集合进行排序。
I'm using VMMV model. You can just add this code to an event or btn or something. and it sorts your collection by parameter (int,string...)-sortVar.