3

ObservableCollectionがWPFリストビューにバインドされています。列ヘッダーをクリックして、ListViewコントロールの列を並べ替えることができるようにしたいと考えています。これを行うために、私はObservableCollectionをソートし、バインディングにGUIの更新を任せています。

ObservableCollectionを並べ替えるには、次のコードを使用しています。

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

注意:データはListViewにバインドされています

私が抱えている問題は、各列に、目的の効果を実現するためのコピーと貼り付けのコードがたくさんあることです。LINQステートメントの「orderbyx.IDdescending」部分を関数パラメーターとして渡すことは可能ですか?

または、目的の結果を達成するための完全に簡単な方法はありますか?

4

6 に答える 6

3

ラムダ式を含むメソッドパラメーターとしてFuncを使用できます。

すべてのタイプをその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 に答える
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 に答える
1

私がこれを達成する方法は、Funcを関数に渡すというkipのアイデアでした。

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

DynamicLinqを探していると思います。

これらのサンプルが役立つかどうかを確認してください:-

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

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

于 2011-06-06T07:24:30.683 に答える
0

これにはDynamicLinqを使用できます

それであなたは次のようなものを書くことができます:

var sortExpr = "x.ID";

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

于 2011-06-06T07:27:29.063 に答える
0

動的クエリを使用できます。実行時に、その場で動的に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 に答える