IObservable<IObservable<T>> observable
がある場合、その上でMerge
を呼び出すと、私のドリフトをキャッチすると、新しい親の子供が含まれます。トリックはObservableCollection<IObservable<Thing>>
をIObservable<IObservable<Thing>>
に変換しています。
ReactiveUIが動作していて、それを使用しても問題がなければ、ObservableCollection<IObservable<Thing>>
をReactiveCollection<IObservable<Thing>>
に変換できます。 ReactiveCollection
はObservableCollection
を継承し、IObservable
も実装しています。
ReactiveUIは(私はあなたがすでにカリバーンマイクロコレクションを使用しているので、それは推測している)問題外である場合は、ObservableCollection
のイベントを使用して変換することができます:
ObservableCollection<IObservable<Thing>> observableCollection = new ObservableCollection<IObservable<Thing>>();
IObservable<IObservable<Thing>> oCollectionObservable = Observable.FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
h => observableCollection.CollectionChanged += h,
h => observableCollection.CollectionChanged -= h
)
.SelectMany(ep => ep.EventArgs.NewItems.Cast<IObservable<Thing>>());
ここで使用方法を示すいくつかのサンプルコードです:
次のクラスを使用して
oCollectionObservable
.Merge()
.Subscribe(t => Console.WriteLine($"Received Thing {{Id = {t.Id}}}"));
var firstObservable = Observable.Range(1, 5)
.Select(i => new Thing { Id = i })
.Concat(
Observable.Range(8, 5)
.Select(i => new Thing { Id = i })
.Delay(TimeSpan.FromSeconds(2))
);
observableCollection.Add(firstObservable);
var subject = new Subject<Thing>();
observableCollection.Add(subject);
subject.OnNext(new Thing { Id = 6 });
subject.OnNext(new Thing { Id = 7 });
:
public class Thing
{
public int Id { get; set; }
}
Thing Observablesを保持するコレクションの種類は何ですか? – Shlomo
@Shlomoああ、私はそれを言及すべきでした。これはObservableCollection(より正確にはCaliburn.MicroのBindableCollection)です。 – TeaDrivenDev
私は 'class Thing:IObservable'を持っていないと仮定しています。打ち間違え?あなたは 'class Thing:IObservable 'を意味するのでしょうか? –
Shlomo