私はリストビューにバインドされたコレクションビューソースオブジェクトを操作してきましたが、CVSはオブジェクトの監視可能なコレクションの上にあるビューです。
次の手法を使用してフィルターを適用する方法を知っています。
cvs.Filter += new FilterEventHandler(SomeFilterFunction);
これは、1つの関数でのみフィルタリングする場合に正常に機能します。問題は、すでにフィルタリングされたCVSの上でフィルタリングしたい場合です。異なる基準に基づいてビュー内のオブジェクトをフィルター処理する別の関数がある場合、オブジェクトは2番目のフィルターの基準でのみフィルター処理され、最初のフィルターの結果は表示されなくなります。
これが私の問題を説明するためのいくつかのサンプルコードです:
cvs.Filter += new FilterEventHandler(SomeFilterFunction1);
cvs.Filter += new FilterEventHandler(SomeFilterFunction2);
public void SomeFilterFunction1(object sender, FilterEventArgs e)
{
SomeObject example = e.Item as SomeObject;
if(example.Name.Contains("A"))
{
e.Accepted = true;
}
else
{
e.Accepted = false;
}
}
public void SomeFilterFunction2(object sender, FilterEventArgs e)
{
SomeObject example = e.Item as SomeObject;
if(example.Name.Contains("B"))
{
e.Accepted = true;
}
else
{
e.Accepted = false;
}
}
したがって、この例では、AとBの文字がフィルターに受け入れられる「SomeObjects」のみが必要です。私の問題は、filterfunction2を使用してcvs + = Filterを呼び出すと、文字Aのオブジェクトを無視して、文字Bを含むオブジェクト名のみが受け入れられることです。したがって、文字Bを含むオブジェクト名は受け入れられますが、Aは受け入れられません。 。
この問題に対する私の現在の解決策は、すべてのフィルター関数を内部に持つ「マスター」フィルター関数を作成することであり、すべてのオブジェクトをすべてのフィルターに通し、オブジェクトがすべてのフィルターを通過すると受け入れられます。これは機能しますが、私のコードは今狂っていて、ロジックは制御不能になっています。CVSの最後のフィルターの結果に新しいフィルター関数を適用する方法を知っている人はいますか?すべてのオブジェクトをすべてのフィルターに送信する代わりに、CVSがこれを自動的に実行しないのはなぜですか、またはCVSについて正しい方法で考えていないのですか?