向已排序的ObservableCollection中添加元素

3

我有一个需要按日期排序的项目列表,所以我正在执行以下操作(我将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”,这会导致一个问题,即如果我有一个大的集合,它将冻结用户界面,直到集合被更新。
我试图找到更好的方法来做这个,能否有人给我建议,什么是最佳实践?

1
在另一个线程中执行此操作。当排序完成后,调用“Dispatcher”将其分配给UI线程中的“pushes”。 - Nikhil Agrawal
2个回答

3
首先,不要使用 `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);
}

好的,谢谢你。那么在我的 // do sorting here 里面我应该放什么? - Sandeep Bansal
现在我想了想,也许将属性公开为 IEnumerable 并在类中使用 Add(Push p) 方法会更好。这样你就可以在集合上使用 Insert。你能否更改属性类型? - default
开发还处于早期阶段,所以我可以随意更改几乎所有内容。 IEnumerable 如何与所有这些合并? - Sandeep Bansal
好的,这里可能有一件事我忘了提。我正在使用JSON.NET和它的ToObject()方法一次性填充ObservableCollection,我的想法是它没有触发add方法。由于我只关心UI上的排序,我在想能否在我的绑定上实现某种转换器来处理这个问题? - Sandeep Bansal
新的CollectionViewSource无法排序。 - Arrow_Raider
显示剩余2条评论

1
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);
    }
}

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接