跟踪集合的状态可能会有些乏味。除非您的集合非常大,否则您可以在每次更改时检查集合以确定您的初始化标准是否得到满足。然后你可以使用DistinctUntilChanged 来获取一个 observable,当你需要执行初始化和清理时会触发它
这是一个例子:
var collection = new ObservableCollection<Int32>();
var observable = Observable
.FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
handler => collection.CollectionChanged += handler,
handler => collection.CollectionChanged -= handler
);
然后您需要一个谓词来确定是否需要初始化(集合“已准备好”)。如果您的集合很大,则此谓词可能会变得很昂贵,因为每次更改集合时都会调用它,但我的假设是这不是问题。
Boolean IsReady(IEnumerable<Int32> items, IReadOnlyList<Int32> itemsRequiredToBeReady) {
return items.Intersect(itemsRequiredToBeReady).Count() == itemsRequiredToBeReady.Count;
}
然后您可以使用DistinctUntilChanged 在IsReady 谓词从真变为假时获取通知,反之亦然:
var isReadyObservable = observable
.Select(ep => IsReady((ObservableCollection<Int32>) ep.Sender, ItemsRequiredToBeReady))
.DistinctUntilChanged();
要初始化和清理,您需要两个订阅:
isReadyObservable.Where(isReady => isReady).Subscribe(_ => Initialize());
isReadyObservable.Where(isReady => !isReady).Subscribe(_ => Cleanup());