2013-08-30 61 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