2009-04-20 7 views
1

ほとんどのWPFデータグリッドコントロールには、表示されたデータをフィルタリングする機能が組み込まれています。私はその機能を使用することに興味がありますが、データグリッドの使用を切断します。スタンドアロンWPFフィルタコントロール

私は、LINQクエリで使用することができますExpression<Func<T, bool>>を返しますユーザーコントロールを見つけることを願っています。誰もそのようなユーザーコントロールを知っていますか? WPFで

答えて

5

は、コントロールに内蔵するためのフィルタリングはCollectionViewを用いて行われます。このCollectionViewは、コレクションコントロールのItemsSourceItemsControlから派生したもの)として割り当てられます。

.NET 3.5 SP1では、CollectionViewクラスのfilterプロパティは、Predicate<object>の代理人を受け取ります。 Predicate<object>は本質的にFunc<object, bool>と同じように見えますが、2つは直接互換性がありません。 Predicate<object>デリゲートをラップするために、Func<object, bool>デリゲートを簡単に作成することができます。

public static Func<object, bool> GetFuncFromPred(Predicate<object> pred) 
{ 
    return (obj => pred.Invoke(obj)); 
} 

あなたはCollectionViewでフィルターにこれを呼び出し、その後、LINQクエリでそれらを使用することができます。

例:

List<object> list = GetList(); 
CollectionView colView = new CollectionView(list); 
ListBox lb = GetListBox(); 
lb.ItemsSource = colView; 
colView.Filter = GetFilter(); 
var filteredItems = list.Where(GetFuncFromPred(colView.Filter)); 
+0

おかげさまで、あなたの答えはちょっと離れていると思います。私は式を提供するWPFコントロールを探しています。 – NoizWaves

+0

誰かがビルドしたカスタムのものがありますが、これを行うWPFコントロールは組み込まれていません。ごめんなさい。あなたが望むなら、あなたがこれをどうやってやれるか説明していました。 –

0

私は知りません。私たちは自分自身を構築しなければなりませんでした。

我々はCollectionViewSourceを使用し、デフォルトのフィルタだけでなく、カスタムフィルタでデフォルトを交換する機能が追加されました。

+0

Bummer。私はそれが行く方法かもしれないと思っています。ジェネリックスとリフレクションを使用するコントロールを作成したり、クラスごとにハードコードされたフィルタを作成したりできましたか? – NoizWaves

+1

Predicat という種類のpublic依存関係プロパティを使用して、CollectionViewSourceオブジェクトにfilterプロパティを設定し、必要に応じてrefreshを呼び出しました。 –

0

あなたはそれをしようとする場合があります:http://dotnetexplorer.blog.com/2011/04/07/wpf-itemscontrol-generic-staticreal-time-filter-custom-control-presentation/

これは、一般的な、ダイナミックな、完全なXAML宣言型のItemsControlフィルタユーザーコントロールです。それは

コンポーネントが盗ん、それはかなり良いパフォーマンスを提供していますので、オブジェクトの値を比較するために、プリコンパイル、リンク式を使用しています...などのデータグリッド、リストボックス、コンボボックスを、フィルタリングすることができます。

希望すると便利です。

+0

しかも、あなたは(もXAMLで)、任意のフィルタリングロジックやC#のコードを書くジュストXAMLであなたのItemsControlを宣言し、任意のオブジェクトの任意のコレクションにバインド、宣言する必要はありません子供が入力コレクションとプロパティウィッヒにフィルタを適用して、ここに移動します。また、 "AND/OR"スイッチモード、 "!"オペランドを参照し、カスタム文字列形式またはコンバーターを参照して、オブジェクト値がUIにあるのと同じ方法で比較用に形式化されていることを確認できます。 – Bruno