我的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
排序?
答案 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。