2

DataGridに表示されるObservableCollectionをフィルタリングしようとしています。これは最初はうまく機能しますが、もう一度フィルタリングしようとすると、フィルタリングされた結果の代わりにsourcecollectionが使用されます。短いコード例:

ICollectionView view = CollectionViewSource.GetDefaultView(myCollection);
view.Filter = delegate(object item){
  User user = item as User;
  if(user != null && user.Name.ToLower().Contains(textbox.Text.ToLower())) return true;
  return false;
};

したがって、私がやりたいのは、コレクション全体ではなく、DataGridに表示されているアイテムのみをフィルター処理することです(もちろん、フィルターを初めて使用するときは、コレクション全体を使用します)。

4

4 に答える 4

5

別のオプションは次のようなものになります...

public void cmbYourComboBox_SelectionChanged(object sender, RoutedEventArgs e)
{
    ICollectionView filteredView = CollectionViewSource.GetDefaultView(collection);

    filteredView.Filter = new Predicate<object>(GetFilteredView);

    dgYourDataGrid.ItemsSource = filteredView;
}

public bool GetFilteredView(object sourceObject)
{
    if (HasConditionOne(sourceObject) && HasConditionTwo(sourceObject)
    {
        return true;
    }
    return false;
}

public bool HasConditionOne(object sourceObject)
{
    //perform your test and evaluate the outcome
}

public bool HasConditionTwo(object sourceObject)
{
    //perform your test and evaluate the outcome
}

ソースオブジェクトが必要なすべての条件を満たす場合、フィルターされたビューでの表示に適していると見なされます。

于 2012-10-20T19:11:53.463 に答える
0

DataGrid共有されているデフォルトのビューを使用しているため、他の何か(おそらく)がビューのフィルターをリセットしている可能性があります。代わりに、独自のコレクションビューを使用してください。

ICollectionView view = new ListCollectionView(myList);
于 2011-09-23T07:22:32.020 に答える
0

コレクションにフィルターが既に設定されているかどうかを確認するヘルパーメソッドを作成できます。既に設定されている場合は、フィルター処理されたリストをビューに保存して再度フィルター処理し、ビューをDataGridのデータソースとして設定します。

ICollectionView view = CollectionViewSource.GetDefaultView(myCollection);

そして、コードのこの部分は、すでにフィルタリングされたコレクションではなく、常にコレクション全体を提供すると思います。

于 2011-09-23T07:29:32.953 に答える
0

修正する必要がある実際の問題は、新しくフィルタリングされたリストをソースコレクションとして次のフィルタにフィードバックすることによってネストされたフィルタを実装するのではなく、CollectionViewFilterのパフォーマンスです。

「必要な」ネストされたフィルター/フィードバックソースコレクションメソッドは、ユーザーが文字の入力と削除を数回試行すると問題が発生します。これは、どのソースコレクションがそのフィルターテキストに適用されるかわからないためです。

たとえば、100人の従業員がいて、「従業員名」を「A」と入力してフィルタリングします...これにより、名前が「A」で始まる50人の従業員が一覧表示されます。ここで、「H」と入力し続けます...「AH」で始まる名前を持つ50人の従業員のうち10人がフィルタリングされます。ただし、「H」を削除します。理想的には、100人の従業員を使用して新しい従業員リストを検索しますが、ネストされたフィルタリングプロセスにフィードバックされるため、10人の従業員を使用します。

誰かがフィルタリングされたテキストからランダムな文字を頻繁に入力して削除すると、どれほど複雑になるか想像してみてください。

したがって、基本的なルールは、ソースコレクション全体でフィルタリングする必要があるということです。

これがわかったら、フィルター機能の改善を試みることができます...

  1. LINQを使用して、入力した各文字のDataGridのItemsSourceに結果を設定します。これらは大規模なコレクションに最適です(30万行のデータグリッドが1つあり、LINQを使用して高速フィルタリングを実行しました)。

  2. LINQはバックグラウンドスレッドで実行し、結果をデータグリッドのItemsSourceに再適用できます。

  3. .Net 4.0の場合、LINQはAsParallel()呼び出しを提供します。非常に効果的。フィルタリングに限られた数のプールされたスレッドを使用します。

  4. LINQは、文字列プロパティ名ベースの検索用のAsQueryable()インターフェイスも提供します。

于 2011-09-23T08:56:39.640 に答える