2017-05-23 3 views
0

ここに全体のクエリがあります。IcollectionView Filterをデータの特定のクラスなしで使用する方法

私はDataGridを持つWPFアプリケーションを持っています。 Datagridは、自動生成列を持つデータベースからデータをTrueとして取得した後、IcollectionViewにバインドします。データをバインドするとき、または自動生成カラムメソッドで、Excelのようなフィルタポップアップを持つヘッダテンプレートを作成しています。

ユーザーがこれらの列ヘッダーのいずれかをクリックすると、Excelのフィルターと同じユーザーのポップアップが表示されます。ユーザーが値を確認/選択解除して[OK]をクリックすると、ユーザーの選択に基づいてデータがフィルタリングされます。

私はIcollectionViewフィルタ機能を使用すると思った。しかし、フィルタのすべてのソリューションは、データをフィルタリングするクラスを取っています。以下のURL(TraceDataItemクラスが慣れている)のように - データグリッドの自動生成列が真であり、データは何もすることができますよう

Filtering ObservableCollection with ICollectionView

私は固定されたクラスを持つことができません。すべての例で述べたように、固定クラスを持たないデータでこのフィルタ機能を使用する方法はありますか?

説明が必要な場合は、投票を停止するのではなく、質問があれば教えてください。これは私が

var tempCollection = (from c in CurrentDistictValues where c.IsChecked == true select c); 
        var val = from c in tempCollection select c.Name; 
        List<object> itemsChecked = new List<object>(); 
        itemsChecked = val.ToList(); 
        string s = String.Join("','", itemsChecked); 
        StringBuilder t = new StringBuilder(s); 
        t.Append("'"); 
        t.Insert(0, "'"); 
        s = t.ToString(); 

のpopup-フィルタで、ユーザーからの確認/未チェック値を取得するために使用していますものですコードused- を追加

はように、ユーザーが選択したすべての値がカンマで区切られています同じことは、データビューのRowFilterに適用することができます -

itemSource.RowFilter = "[" + columnName + "]" + " " + " IN " + "(" + s + ")"; 

- itemSourceが存在し、コード&列名にDataViewのは、我々が適用されているプロパティがされていますフィルタ。

だからItemSourceとしてIcollectionViewを使用する場合、どのようなアプローチが必要ですか?

+0

フィルタリングするプロパティをどのように知っていますか? – mm8

+0

@ mm8ヘッダークリックから列名を取得しています。 FYI、私は小さなデータのためにうまく動作するdataview.RowFilterを使って別の方法を実装しましたが、大きなデータの場合はパフォーマンスが非常に悪いです。だから私はIcollectionViewフィルター機能へのいくつかのリンクを見つけたときに私は解決策を探していた。 –

+0

あなたは反射を使ってICollectionViewをフィルタリングできるはずです。これまでに書いたコードを投稿してください。 – mm8

答えて

0

ICollectionViewに表示される要素の種類がわからない場合でも、リフレクションを使用して要素をフィルタリングできます。このようなもの:

string propertyName = "Name"; //property to filter by 
string valueToCompareAgainst = "x"; 
ICollectionView view = ...; 
view.Filter = (obj) => 
{ 
    Type type = obj.GetType(); 
    System.Reflection.PropertyInfo pi = type.GetProperty(propertyName); 
    if(pi != null) 
    { 
     object value = pi.GetValue(obj); 
     return value.Equals(valueToCompareAgainst); 
    } 
    return false; 
}; 
+0

複数のvalueToCompareAgainst値がある場合はどうすればよいですか? 「x、y、z」に似ています。 –

+0

同じことです。つまり、プロパティごとにPropertyInfoを取得し、それぞれのプロパティを上記のように比較する必要があります。 – mm8

+0

上記のコードを使用して、DataGridの1つの列のデータをフィルタリングすることができました。複数の列に関する問題に直面しています。 IcollectionViewで最初のフィルタを実行したかどうかを知っていますか?次のフィルタでデータをフィルタリングするか、もう一度データを完成しますか? –

関連する問題