CollectionViewSource のフィルタ処理の再評価

WPF の DataGrid へフィルタ処理を行ったデータを表示している場合に、表示しているデータの修正で当該フィルタの表示条件に関わる項目が修正された際(表示条件が true から false になった場合)、プロパティ変更通知を行っても当該データが DataGrid に表示されたままの状態となります 🙁 そこで、フィルタ処理の再評価を明示的に指示する必要があります(逆に言うと、フィルタ処理の再評価を行うのに、プロパティ変更通知は不要です)。

CollectionViewSource.View.Refresh() メソッドでビューを再生成する方法もありますが、.NET Framework 4.5 で IsLiveFilteringRequested プロパティ「リアルタイムでデータをフィルター処理するかどうかを示す値を取得または設定します。」が追加されているので、試してみました。

結果を先に書くと、次のようなコードを書くことで期待した結果を得ることができます(CollectionViewSource はインスタンス化しておく必要があります)。


表示条件に関わる項目を修正
CollectionViewSource.IsLiveFilteringRequested = true;
CollectionViewSource.IsLiveFilteringRequested = false;

CollectionViewSource の IsLiveFilteringRequested プロパティは、true が設定されると即座にフィルタ処理の再評価を行うようです。ただ、再評価後にプロパティ値を false に戻すことはしないようで、複数のデータに対して同様の修正を行った場合、2件目以降は true を設定しても再評価が行われませんでした。なので、 IsLiveFilteringRequested プロパティに true を設定した直後に false を設定して、次回(他のデータ)の再評価が行われるようにしています。

トリガー的なプロパティになっているので、再評価後には On から Off に戻してほしいなぁと思いますけど、.NET Framework 4.5.1 でも同様の動きでした :mrgreen:


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です