2011-04-12 235 views
15

我有一個ObservableCollection,其中MyData是具有4個屬性的類,即int id,字符串名稱,布爾IsSelected,字符串IsVisible。Sort ObservableCollection - 什麼是最好的方法?

此ObservableCollection被綁定到帶有複選框(例如城市數據)的組合框。現在,當用戶選中複選框時,下次打開下拉列表時 - 所有選擇應按名稱以升序排列。

當用戶在組合框中鍵入3個字符時,我也實現了自動完成功能,下拉菜單首先顯示所有選擇,然後從用戶輸入3個字符開始的所有項目。

我已經研究並實施了下面的代碼,它工作正常,但我想知道這是否是最好的辦法還是我可以以更好的方式實現這一點,代碼:

 IEnumerable<MyData> sort; 
     ObservableCollection<MyData> tempSortedCities = new ObservableCollection<MyData>(); 
     sort = City.OrderByDescending(item => item.IsSelected).ThenBy(item => item.Name.ToUpper()) ; 
     // City is my observablecollection<MyData> property in my Model binded to combobox in UI 
     foreach (var item in sort) 
      tempSortedCities.Add(item); 


     City.Clear(); // City is my observablecollection<MyData> property in my Model 
     City = tempSortedCities; 
     tempSortedCities = null; 
     sort = null; 

謝謝提前爲您的時間!

回答

23

ICollectionView似乎是一個完美的適合這個。它專門爲無需修改原始集合而對集合進行排序,過濾和分組而設計。

您可以用下面的代碼獲得ICollectionView爲您蒐集的實例:

var sortedCities = CollectionViewSource.GetDefaultView(City); 

然後,您可以設置排序加入SortDescription類型的實例給ICollectionView.SortDescriptions集合:

sortedCities.SortDescriptions.Add(new SortDescription("IsSelected", ListSortDirection.Descending)); 
sortedCities.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending)); 

然後您可以將ComboBox直接綁定到集合視圖(而不是City集合),它將顯示已排序的數據。

+1

如果您排序默認視圖,然後綁定到城市集合應該給你排序的結果。綁定到集合時,WPF將綁定到其默認視圖。 – Goran 2011-04-12 06:49:58

+2

@Goran - 是的,我知道。但我認爲最好是明確的。 – 2011-04-12 07:46:37

+0

謝謝帕夫洛! – 2011-04-16 05:25:28

相關問題