2013-08-30 59 views
3

我的第一篇文章在這裏。WPF list <t>排序

我有一個列表「<」frameworkelement>,我填充選擇過程。每個frameworkelement都有一個保存它的ZOrder的uid。

我需要由ZOrder從最低到最高排序這些。我能得到這個使用列表框和添加的UID是這樣的:

  //Add Object Uid's 
      ListBox lstTempOrder = new ListBox(); 
      foreach(FrameworkElement feObject in MainWindow.Data.SelectedObjects) 
      { 
       lstTempOrder.Items.Add(feObject.Uid); 
      } 
      //Reorder from 0 to above of the ZIndexes  
      lstTempOrder.Items.SortDescriptions.Add(new System.ComponentModel.SortDescription("", System.ComponentModel.ListSortDirection.Ascending)); 

,但我需要用List這樣做「<」 FrameworkElement的>和排序。

這裏是我填充列表」 < 「T>的代碼(的selectedObjects和CopyObjectsCollections是列表」 < 「FrameworkElement的>」 名單。

  foreach(FrameworkElement feObject in MainWindow.Data.SelectedObjects) 
      { 
       MainWindow.Data.CopyObjectsCollection.Add(feObject); 
      } 

我已經看了CollectionViewSource和IComparer的,但我可以「T真正使它的任何意義。

+1

除了手動做這個的,你應該將列表框綁定到[CollectionViewSource(HTTP:// msdn.microsoft.com/en-us/library/system.windows.data.collectionviewsource.aspx),它允許對項目進行排序。有關示例,請參閱[綁定到集合](http://msdn.microsoft.com/zh-cn/library/ms752347.aspx#binding_to_collections)。 – Clemens

+0

感謝您的回答。我不確定你是用手工來做什麼的。列表框排序只是爲了測試,它的工作原理,但我不能解決如何在列表「CopyObjectsCollection」上做同樣的事情。我從來沒有使用過綁定。 – Drew

+0

綁定在WPF中至關重要。您可能會開始閱讀MSDN上的[數據綁定概述](http://msdn.microsoft.com/en-us/library/ms752347.aspx)文章。 – Clemens

回答

1

我可能有誤看了你的問題,但如果你只是想你List<T>排序,那麼你爲什麼不只是使用LinQOrderBy方法?

MainWindow.Data.CopyObjectsCollection = 
    MainWindow.Data.CopyObjectsCollection.OrderBy(f => f.Uid).ToList(); 

如果排序,以錯誤的方式對你的要求,那麼你可以使用這個:

MainWindow.Data.CopyObjectsCollection = 
    MainWindow.Data.CopyObjectsCollection.OrderByDescending(f => f.Uid).ToList(); 

UPDATE >>>

OrderByLinQ擴展方法。在班級頂部添加using System.Linq;以使用它。 f涉及您的FrameworkElement對象的實例。上面的lambda表達式基本上意味着'使用Uid屬性值進行排序'。

更新2 >>>

OrderBy方法並沒有改變原始集合...這就是爲什麼我的例子中,收集組到OrderBy方法的結果。看到這個簡單的例子:

List<FrameworkElement> elements = new List<FrameworkElement>(); 
elements.Add(new FrameworkElement() { Uid = "Object1003-1" }); 
elements.Add(new FrameworkElement() { Uid = "Object1002-2" }); 
elements.Add(new FrameworkElement() { Uid = "Object1002-1" }); 
elements.Add(new FrameworkElement() { Uid = "Object1001-1" }); 
elements.Add(new FrameworkElement() { Uid = "Object1001-3" }); 
elements.Add(new FrameworkElement() { Uid = "Object1001-2" }); 
string result = string.Join(", ", elements.Select(f => f.Uid)); 
elements = elements.OrderBy(f => f.Uid).ToList(); 
string orderedResult = string.Join(", ", elements.Select(f => f.Uid)); 

通過比較result價值觀和orderedResult你可以看到這個完美預定他們。

更新3(希望是最後一個)>>>

老兄,你需要了解Lambda表達式......看一看在MSDN的Lambda Expressions (C# Programming Guide)頁面瞭解更多信息。

elements = elements.OrderBy(f => f.Uid).ToList(); 

在此Lambda表達式的f之前的 '=>' 宣告此表達式。這是相當標準與像Exceptions一個字母來命名這些參數,但我們名字這事:

elements = elements.OrderBy(frameworkElement => frameworkElement.Uid).ToList(); 
+0

感謝您的回覆。它看起來不錯,但我的List 似乎沒有OrderBy。我假設「f」會是我的「feObject」? – Drew

+0

命名空間有所不同。我得到一個不能申報的第一個「F」「feObject」不同的含義。我宣佈了一個新的frameworkelement在這裏使用編譯,但列表集合在foreach後保持不變。我在foreach和之後嘗試了它。我確定這是我的,因爲這看起來應該可以工作。感謝您的幫助,我很感激。每個元素的Uid就像「Object1001-1」和「Object1002-2」等等。 – Drew

+0

如果我只是使用MainWindow.Data.CopyObjectsCollection.OrderBy(feObject => feObject.Uid).ToList();編譯後的foreach循環之後。不知道如何我沒有在其他地方宣佈feobject,但訂單仍然是一樣的。沒有什麼變化。 。 – Drew