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

时间:2010-08-24 02:50:00

标签: c# .net silverlight windows-phone-7 observablecollection

我的Windows Phone 7应用程序中有一个名为MyObjectList的数据对象列表,它继承了ObservableCollection<MyObject>。我将列表保存在名为App的{​​{1}}的公共属性中。我的目标是将数据绑定到MyObjects并按ListBox排序。

目前,我在XAML中有一个名为MyObject.Name的{​​{1}},并在构造函数中使用以下代码将其链接起来:

ListBox

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

MyObjects

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

我可以这样做,当我向this.MyObjectsList.ItemsSource = ((App)App.Current).MyObjects .OrderBy(x => x.Name) 添加项目时,它会显示在ListBox中按ObservableCollection排序?

4 个答案:

答案 0 :(得分: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;

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

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

答案 1 :(得分:4)

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

  

http://phillters.wordpress.com/2009/05/14/sortedobservablecollection/

答案 2 :(得分:1)

这对Silverlight没有帮助,但对于WPF 3.5 / 4,有一种更好的方法来执行此操作CollectionView

答案 3 :(得分:0)

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

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

此外,This Post here..可能会帮助您。它使用CollectionView。