かずきのBlog@hatena

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

ReactiveProperty v1.0.2をリリースしました

間にv1.0.1も挟んでますが、こんな感じの変更をしています。

ReadOnlyReactiveCollectionの生成を簡略化

ObservableCollectionからReadOnlyReactiveCollectionを作ろうと思うと今まで以下のようなコードが必要でした。

var models = new ObservableCollection<Model>();

var changes = models
    .ToCollectionChanged()
    .Select(x => new CollectionChanged<ViewModel>
    {
        Action = x.Action,
        Index = x.Index,
        Value = x.Value == null ? null : new ViewModel(x.Value)
    });
var source = new ObservableCollection<ViewModel>(
    models.Select(m => new ViewModel(m));

var viewModels = new ReadOnlyReactiveCollection<ViewModel>(changes, source);

めんどくさいので下のように書けるようにしました。

var models = new ObservableCollection<Model>();
var viewModels = models.ToReadOnlyReactiveCollection(m => new ViewModel(m));

IDisposableExtensions.AddToメソッドに戻り値を追加

地味にReactivePropertyやReadOnlyReactiveCollectionやReactiveCommandはIDisposableを実装しています。こいつらは、時がきたらDisposeを呼んでやる必要があります。個別にDisposeを呼ぶのがだるいので、CompositeDisposableあたりに纏めておいて呼ぶのが楽なので、今までこんな感じに書いてました。

var d = new CompositeDisposable();
var p1 = ...何か重いIObservable<T>...().ToReactiveProperty();
p1.AddTo(d);

// 不要になったタイミングで
d.Dispose();

AddTo拡張メソッドの戻り値がvoidだったので、メソッドチェインの中に入れなかったのですが、AddTo拡張メソッドの戻り値で第一引数を戻り値として返すようにしました。なので、以下のように破棄予定のReactiveProperty等はメソッドチェイン内でCompositeDisposableに追加できるようになりました。

var d = new CompositeDisposable();
var p1 = ...何か重いIObservable<T>...().ToReactiveProperty().AddTo(d);

// 不要になったタイミングで
d.Dispose();