読者です 読者をやめる 読者になる 読者になる

かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

ReactiveProperty v2.1.8をリリースしました

最近BlogがReactivePropertyのリリース日記になってる感じがありますが…。v2.1.8をリリースしました。

www.nuget.org

v2.1.8

追加

  • Helpers名前空間にリアルタイムにコレクションの要素をフィルタリングするコレクション FilteredReadOnlyObservableCollection を追加しました。

解説

ObserveElementXXXXメソッドを追加したときに、コレクションの増減に対応するコードまで入れるとリアルタイムにコレクションから条件を満たす要素を選択できるという例を示しました。

okazuki.hatenablog.com

このコードに順序の管理を加えて、リアルタイムフィルタリングをするコレクションを作成しました。

テストコードからの抜粋になりますが、以下のように使います。

var source = new ObservableCollection<Person>(new[]
{
    new Person { Name = "tanaka1", IsRemoved = true },
    new Person { Name = "tanaka2", IsRemoved = false },
    new Person { Name = "tanaka3", IsRemoved = false },
});

// 初期状態ではtanaka1のみが対象
var filtered = source.ToFilteredReadOnlyObservableCollection(x => x.IsRemoved);
filtered.Select(x => x.Name).Is("tanaka1");
filtered.Count.Is(1);

// 無関係の要素を追加しても変わらない
source.Add(new Person { Name = "tanaka4", IsRemoved = false });
filtered.Select(x => x.Name).Is("tanaka1");
filtered.Count.Is(1);

// プロパティを変更してフィルターの対象になった場合は、その要素が追加される
source[3].IsRemoved = true;
filtered.Select(x => x.Name).Is("tanaka1", "tanaka4");
filtered.Count.Is(2);

source.Clear();
filtered.Count.Is(0);