绑定到ListBox中的已排序的ObservableCollection <T>

Ben*_*ack 8 .net c# silverlight observablecollection windows-phone-7

我在我的Windows Phone 7应用程序中有一个数据对象列表MyObjectList,它继承了ObservableCollection<MyObject>.我将列表保存在App被调用的公共属性中MyObjects.我的目标是将数据绑定到a ListBox并按其排序MyObject.Name.

目前,我ListBox在XAML中使用了名称MyObjectsList和构造函数中的以下代码来链接它:

public MyObjectListView()
{
    InitializeComponent();
    this.MyObjectsList.ItemsSource = ((App)App.Current).MyObjects;
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.我添加项目MyObjects,他们出现在ListBox.但是,数据在列表中显示时不按名称排序.我尝试了以下更改以获取要排序的数据:

this.MyObjectsList.ItemsSource = ((App)App.Current).MyObjects
                                         .OrderBy(x => x.Name)
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,我看不到任何反映在ListBox排序或其他方面的对象.

我可以这样做,当我向我添加一个项目时ObservableCollection,它会显示.NameListBox?中排序?

Mat*_*sto 11

您的示例的问题是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;
Run Code Online (Sandbox Code Playgroud)

其他答案都提出了可行的替代方案,但这将解决问题中的问题.

FWIW,在Silverlight 4中有一个PagedCollectionView,但Windows Phone 7的Silverlight基于Silverlight 3并且不可用.我只是提到这一点,让你意识到WP7最终更新到SL4.


Voo*_*ild 0

看看http://mokosh.co.uk/post/2009/08/04/how-to-sort-observablecollection/

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

另外,这里的这篇文章..可能会对您有所帮助。它使用 CollectionView。