TL;DR
タイトルでもうすでに完結してるんですが・・・、DisposeではなくClearを使えばよかったというメモ。
背景
CompositeDisposableは一度でもDispose呼んじゃうと、その後にAddしても追加したそばからDisposeが呼ばれて破棄されるようになってしまいます。というかそういう仕様です。
それを知らずに使ってて、ReactivePropertyのSubscribeが2回目以降に効かなくなって困るという状態でした。
なのでDispose後に再度CompositeDisposableをnewするというイマイチな実装にしてました・・・。
CompositeDisposable.Add Method (System.Reactive.Disposables)
Addは以下のような仕様です。CompositeDisposable自体がdisposeされると、その後のAddされたものは都度disposeされるようになるようです。
Adds a disposable to the CompositeDisposable or disposes the disposable if the CompositeDisposable is disposed.
CompositeDisposable.Clear Method (System.Reactive.Disposables)
Clearなら登録されているものを全てdisposeしますが、CompositeDisposable自体はdisposeしません。なのでそのまま継続利用できます。
Removes and disposes all disposables from the GroupDisposable, but does not dispose the CompositeDisposable.
CompositeDisposable.Remove Method (System.Reactive.Disposables)
Removeも削除時に対象のdisposeを呼ぶ仕様なので、場合によってはRemoveを利用してもよいかと思います。
Removes and disposes the first occurrence of a disposable from the CompositeDisposable.
結論
再利用したい場合はDisposeではなく、Clear or Remove を使いましょう。
(サンプルコードがDipose呼んでるものばかりなので、CompositeDisposableは再利用できないものと勘違いしていました)
参考
CompositeDisposable Class (System.Reactive.Disposables)
この記事を書いてる途中まで、以下の記事(RxJava)のようにReusableCompositeDisposableを定義しないといけないのかなと思ってました・・・。
CompositeSubscriptionは再利用できない #RxJava - Islands in the byte stream