C# 绑定到已排序的ObservableCollection<;T>;在列表框中

C# 绑定到已排序的ObservableCollection<;T>;在列表框中,c#,.net,silverlight,windows-phone-7,observablecollection,C#,.net,Silverlight,Windows Phone 7,Observablecollection,我的Windows Phone 7应用程序中有一个名为MyObjectList的数据对象列表,它继承了ObservableCollection。我将列表保存在名为MyObjects的App公共属性的内存中。我的目标是将数据绑定到列表框,并按MyObject.Name对其进行排序 目前,我在XAML中有一个名为MyObjectsList的ListBox,在构造函数中有以下代码将其链接起来: public MyObjectListView() { InitializeComponent();

我的Windows Phone 7应用程序中有一个名为
MyObjectList
的数据对象列表,它继承了
ObservableCollection
。我将列表保存在名为
MyObjects
App
公共属性的内存中。我的目标是将数据绑定到
列表框
,并按
MyObject.Name
对其进行排序

目前,我在XAML中有一个名为
MyObjectsList
ListBox
,在构造函数中有以下代码将其链接起来:

public MyObjectListView()
{
    InitializeComponent();
    this.MyObjectsList.ItemsSource = ((App)App.Current).MyObjects;
}
这很有效。我将项目添加到
MyObjects
,它们显示在
列表框中。但是,当数据出现在列表中时,它不会按名称排序。我尝试了以下更改以获得要排序的数据:

this.MyObjectsList.ItemsSource = ((App)App.Current).MyObjects
                                         .OrderBy(x => x.Name)
但是当我这样做时,我看不到
列表框中反映的任何对象已排序或其他

我该怎么做才能在向我的
可观察集合
中添加一个项目时,它在
列表框
中按
.Name
排序显示出来呢?

看一看

它解释了如何扩展ObservableCollection以公开底层Items.Sort()方法,然后通知侦听器集合已更改


还有,也许能帮你。它使用CollectionView。

您可以使用已排序的集合,而不是标准的
可观察集合。有人在这里写了一个
SortedObservableCollection


这对Silverlight没有帮助,但对于WPF 3.5/4,有一种更好的方法可以实现这一点,它涉及到

示例的问题是OrderBy方法返回IOrderedEnumerable类型的对象,而不是ObservableCollection

这里有一些您可以做的事情,而无需像其他答案一样实现自定义集合

var sortedMyObjects = new ObservableCollection<MyObject>();
foreach (var myobj in ((App)App.Current).MyObjects.Orderby(x => x.Name))
    sortedMyObjects.Add(myobj);
this.MyObjectsList.ItemsSource = sortedMyObjects;
var sortedMyObjects=新的ObservableCollection();
foreach(var myobj in((App)App.Current.MyObjects.Orderby(x=>x.Name))
分类对象。添加(myobj);
this.MyObjectsList.ItemsSource=已分类的myObjects;
其他答案都提出了可行的替代方案,但这将解决问题中的问题


FWIW,在Silverlight 4中有一个PagedCollectionView,但WindowsPhone7的Silverlight基于Silverlight 3,因此不可用。我提到这一点只是为了让您知道WP7最终会更新到SL4。

在ItemsSource上使用Linq将禁用Observable集合的“Observable”位您引用的第一个链接指向一篇关于使用
的伟大文章。一旦我找到了正确的名称空间来使用(XAML总是一个挑战),它就工作得非常好。谢谢第一个链接似乎是死的,这对我来说非常有效!转换我所有的代码来利用它。这个实现非常糟糕,因为它在一个排序的集合上有一个O(n)插入。我坚决反对它。我不认为任何人会有足够大的收藏以至于O(n)成为一个问题。