向已排序的可观察集合添加项
本文关键字:集合 添加 观察 排序 | 更新日期: 2023-09-27 18:12:49
我有一个需要按日期排序的项目列表,所以我正在做的是以下操作(我将ItemsControl
绑定到Pushes
:
public ObservableCollection<Push> Pushes
{
get { return Settings.PushCol; }
set { Settings.PushCol = value; OnPropertyChanged("Pushes"); }
}
Pushes = new ObservableCollection<Push>(
Settings.PushCol
.Where(push => push.Active == true)
.OrderByDescending(push => push.Created)
);
这里的问题是,如果我要添加到Pushes
,我将不得不使用上面的代码求助于我的Pushes
,这导致的问题是,如果我有一个大的集合,它将冻结UI,直到集合被更新。
我正试图找到一个更好的方法来做到这一点,谁能告诉我这里的最佳实践是什么?
首先,不要在列表中使用set
字符。这样,您就可以控制如何将项目添加到列表中。
有很多方法可以通过CollectionViewSource
对ObservableCollection进行排序。你可以在这里读到。
另一个解决方案是将列表公开为IEnumerable<Push>
public IEnumerable<Push> Pushes // no Add method on IEnumerable
{
get { return Settings.PushCol; }
}
然后在你的类中实现一个Add
方法,它控制项目的添加方式。
public void Add(Push p){
int i = 0;
for (; i < Settings.PushCol.Count; i++)
{
if (Settings.PushCol[i].Created > p.Created)
break;
}
Settings.PushCol.Insert(i, p);
}
public static class ObservableCollectionExtensions
{
/// <summary>
/// Sorted add for observable collection using custom comparer
/// </summary>
public static void AddSorted<T>(this ObservableCollection<T> collection, T item, IComparer<T> comparer)
{
var sortableList = new List<T>(collection);
int index = sortableList.BinarySearch(item, comparer);
if (index < 0)
index = ~index;
collection.Insert(index, item);
}
}