3

我有一个绑定到 WPF 列表视图的 ObservableCollection。我希望能够通过单击列标题对 ListView 控件的列进行排序。为此,我对 ObservableCollection 进行排序并让绑定负责更新 GUI。

要对 ObservableCollection 进行排序,我使用以下代码:

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

注意:数据绑定到 ListView

我遇到的问题是,对于每一列,都会有很多复制粘贴代码来达到预期的效果。是否可以将 LINQ 语句的“orderby x.ID 降序”部分作为函数参数传递?

或者有没有更简单的方法来达到预期的结果?

4

6 回答 6

3

你定义一个这样的排序函数

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

(按负 ID 排序与按 ID 降序排序的效果相同。)

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

var sortedData = new ObservableCollection<Tag>(data.OrderBy(sortFunc));
于 2011-06-06T07:47:26.627 回答
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。

于 2011-06-06T07:23:49.870 回答
1

我设法实现这一点的方法是使用 thekip 将 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;
}
于 2011-06-06T07:47:06.610 回答
0

我认为您正在寻找动态 Linq。

看看这些样本是否有帮助:-

http://msdn.microsoft.com/en-gb/bb737920.aspx

http://msdn.microsoft.com/en-gb/bb737920.aspx

于 2011-06-06T07:24:30.683 回答
0

您可以为此使用Dynamic Linq

有了它,您可以编写如下内容:

var sortExpr = "x.ID";

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

于 2011-06-06T07:27:29.063 回答
0

您可以使用 Dynamic Query。它将在运行时动态、动态地编写 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

于 2014-03-17T23:21:04.643 回答