【问题标题】:Adding items to a sorted observablecollection将项目添加到排序的 observablecollection
【发布时间】:2014-07-12 12:29:04
【问题描述】:

我有一个需要按日期排序的项目列表,所以我正在做的事情如下(我将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,直到收藏已更新。

我正在尝试找到一种更好的方法来做到这一点,谁能告诉我这里的最佳做法是什么?

【问题讨论】:

  • 在另一个线程中执行此操作。排序完成后调用Dispatcher 分配给 UI 线程中的pushes

标签: c# sorting observablecollection windows-phone-8.1 win-universal-app


【解决方案1】:

首先,不要将setters 用于您的列表。这样,您可以控制如何将项目添加到您的列表中。

有一些方法可以通过CollectionViewSource 对 ObservableCollection 的项目进行排序。你可以阅读here

另一种解决方案是将您的列表公开为IEnumerable&lt;Push&gt;

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

【讨论】:

  • 好的,谢谢,所以在我的 // 在这里进行排序我会放置什么?
  • 现在我想到了,也许将属性公开为IEnumerable 并在你的类中使用Add(Push p) 方法会更好。这样你就可以在集合上使用Insert。您可以更改属性类型吗?
  • 好吧,它还处于开发的早期阶段,所以我可以根据需要更改几乎所有内容。 IEnumerable 将如何融入这一切?
  • 好的,这是我可能错过的另一件事。我正在使用 JSON.NET,它是 ToObject() 方法来一次填充 ObservableCollection,我的想法是它没有命中 add 方法。因为我只关心 UI 上的排序,所以我在想我是否可以在绑定上实现某种转换器来处理这个问题?
  • 当然可以。或者使用 CollectionViewSource。不幸的是,我不熟悉 JSON 解析以及它如何添加到集合中。您可能需要提供一个 sscce 来演示您当前的解决方案。
猜你喜欢
  • 2015-07-13
  • 2017-07-30
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多