2011-06-06 28 views
3

我有一个ObservableCollection绑定到WPF列表视图。我期望能够通过单击列标题来对ListView控件的列进行排序。为此,我正在对ObservableCollection进行排序,并让绑定负责更新GUI。C#是否可以通过LINQ子句将命令抽象为函数参数?

排序我使用下面的代码的ObservableCollection:

sortedData = new ObservableCollection<Tag>(from x in data 
              orderby x.ID descending 
              select x); 
data = sortedData; 

注:数据被绑定到ListView

我遇到的问题是,对于每列将有大量的复制粘贴代码来达到预期的效果。是否可以将LINQ语句的'orderby x.ID descending'部分作为函数参数传递?

还是有一个完全简单的方法来实现预期的结果?

回答

3

您可以使用Func作为包含lambda表达式的方法参数。

如果你想按照它的ID来定购每一种类型,你也可以在所有这些类型上指定一个接口,并使用一个通用的方法。

例如

public ObservableCollection<Tag> Sort(Func<ObservableCollection<Tag>> sortFunc) 
{ 
    //do something else 
    data = sortFunc(); 
    //do something else 
} 

可以这样调用

其中Sort(list.OrderByDescending(x => x.ID));

列表是您的ObservableCollection。

+2

这是一个很好的答案,但绝对需要的代码示例 – 2011-06-06 07:27:45

0

您可以使用Dynamic Linq这个

蒙山它,你可以写这样的:

var sortExpr = "x.ID";

IQueryable<Tag> sortedQuery = query.OrderBy(sortExpr);

1

我设法达到这个目标的方法是让kip将Func传递给函数,

sortColumn("ID", x => x.ID); 

protected void sortColumn<T>(string name, Func<Tag, T> selector) 
{ 
    ObservableCollection<Tag> sortedData = new ObservableCollection<Tag>(TagData.OrderBy(selector)); 

    data = sortedData; 
} 
3

你定义一个排序功能这样的:

Func<Tag, int> sortFunc = x => -x.ID; 

(由负ID排序具有如ID降序排序相同的效果。)

然后,您可以将此排序功能对任何IEnumerable<Tag>

var sortedData = new ObservableCollection<Tag>(data.OrderBy(sortFunc)); 
+0

啊,那** ** INT在** Func <> **正在绊倒我... 我试图把那里的集合类型,如** Func > **(它根本没有任何意义) 所以第一个arg是集合中类的类型,sec ond是该类中属性的返回类型 (这样做更有意义) 感谢提供否定结果的提示以模拟降序以及 – 2011-12-20 02:28:37

0

您可以使用动态Query.It将构成LINQ语句上的苍蝇,动态,在运行时。

例如:

var query = 
      db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10). 
      OrderBy("CompanyName"). 
      Select("New(CompanyName as Name, Phone)"); 

你可以在这里得到它: http://code.msdn.microsoft.com/DynamicQuery-f65f6a4d

相关问题