2010-08-24 93 views
8

我有一個Windows Phone 7應用程序中名爲MyObjectList的數據對象列表,它繼承ObservableCollection<MyObject>。我在名爲MyObjectsApp的公共財產中將該列表保留在內存中。我的目標是將數據綁定到ListBox,並按MyObject.Name排序。綁定到已排序的ObservableCollection <T>列表框中

目前,我有一個XAML與ListBoxMyObjectsList並在構造函數下面的代碼把它連接起來:

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添加項目時,它顯示在ListBox中按.Name排序?

+4

上的ItemsSource使用LINQ將禁用的ObservableCollection – 2010-08-24 02:59:02

回答

0

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

它解釋瞭如何擴展ObservableCollection以公開基礎Items.Sort()方法,然後通知偵聽器集合已更改。

此外,This Post here..可能會幫助你。它使用CollectionView。

+0

的「可觀測」位你引用的第一個鏈接指向關於使用''一個偉大的文章。一旦我想通了正確的命名空間使用(總是與XAML是一個挑戰),它的工作完美。謝謝! – 2010-08-24 03:38:00

+0

第一個鏈接看起來已經死了 – vwegert 2014-03-12 20:33:09

4

您可以使用排序的集合而不是標準ObservableCollection。有人寫了SortedObservableCollection這裏:

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

+0

這個實現非常糟糕,因爲它在已排序的集合上有一個O(n)插入。我明確反對它。 – Benlitz 2013-08-02 06:04:07

+0

我不認爲任何人都會有足夠大的O(n)成爲問題。 – roim 2014-08-31 08:07:26

1

這不會幫助你的Silverlight,但對WPF 3.5/4,有一個更好的方式來做到這一點涉及CollectionView

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。

+0

這對我來說真是太棒了!轉換我的所有代碼以利用這一點。 – pearcewg 2011-01-18 23:09:12

+0

偉大的解決方案。 – peterept 2012-03-31 22:17:29

相關問題