我有一个ObservableCollection和一个WPF UserControl数据绑定到它。该控件是一个图形,为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。它的值取决于集合中项目的顺序。
谢谢。
7条答案
按热度按时间laawzig21#
嗯,我想问你第一个问题是:对
ObservableCollection
进行排序真的很重要吗?还是您真正想要的是对GUI中的显示进行排序?我假设目标是有一个排序的显示,将更新“真实的”。然后我看到2个解决方案
1.获取
ObservableCollection
的ICollectionView
并对其进行排序,如此处所述http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/1.将您
ObservableCollection
绑定到CollectionViewsource
,在其上添加排序,然后将该CollectionViewSource
用作ListView
的ItemSource
。即:
添加此名称空间
那么
像这样绑在一起
xu3bshqb2#
我刚刚创建了一个扩展
ObservableCollection
的类,因为随着时间的推移,我还希望使用其他我习惯于使用的List
功能(Contains
、IndexOf
、AddRange
、RemoveRange
等)我通常用它来搭配
MyCollection.Sort(p => p.Name);
下面是我的排序实现
yuvru6vn3#
对ObservableCollection进行排序的问题在于,每次更改集合时,都会触发一个事件。因此,对于从一个位置删除项并将其添加到另一个位置的排序,最终会触发大量事件。
我认为最好的办法是一开始就按照正确的顺序将这些内容插入ObservableCollection中。从集合中删除项不会影响排序。
因此,如果要使用字符串(例如),代码将如下所示
编辑
如果扩展ObservableCollection并提供自己的insert/add方法,就可以保持调用的一致性。
插入索引将被忽略。
ewm0tg9j4#
如何使用LINQ对不同集合上的数据进行排序:
这对我很有效。
m528fe3b5#
同样使用LINQ/Extensionmethod,可以通过不将源列设置为已排序的列来避免触发NotifyPropertyChanged事件,而是清除原始列并添加已排序列的项。(如果实现,这将继续触发Collectionchanged事件)。
nnt7mjpx6#
我知道这是老帖子,但是我对大多数的解决方案都不满意,因为它破坏了绑定。所以如果有人遇到,这就是我所做的。你可以为更多的属性排序创建更多的重载。
这不会破坏绑定。
和用法:
l7mqbcuq7#
我用的是VMMV模型。你可以把这段代码添加到一个事件或者btn或者其他什么东西中。它会根据参数(int,string...)-sortVar对你的集合进行排序。