3

我有 ObservableCollection<T> 并且我需要创建 observable<bool> 如果集合包含任何元素则返回 true

我试着这样做

var collectionHasElementsObservable =
            Observable.FromEventPattern<NotifyCollectionChangedEventHandler,NotifyCollectionChangedEventArgs>(
                ev => ((ObservableCollection<MyType>)_items).CollectionChanged += ev,
                ev => ((ObservableCollection<MyType>)_items).CollectionChanged -= ev);

但我不知道如何将其转换为 IObservable<bool>

如何从中创建 observable<bool> ?

4

2 回答 2

10

您可以使用Select将事件映射到具有元素之一:

        ObservableCollection<int> coll = new ObservableCollection<int>();

        var hasElements = 
        Observable.FromEventPattern<NotifyCollectionChangedEventHandler,NotifyCollectionChangedEventArgs>(
            a => coll.CollectionChanged += a,
            a => coll.CollectionChanged -= a)
        .Select(_ => coll.Count > 0);

例子:

        hasElements.Subscribe(Console.WriteLine);

        coll.Add(1);
        coll.Add(2);
        coll.Remove(1);
        coll.Remove(2);

输出:

True
True
True
False

这是你要找的吗?

于 2012-11-29T15:24:39.123 回答
8

我注意到你有 ReactiveUI 标签 - 如果你使用 ReactiveCollection,这会更容易:

coll.CollectionCountChanged.Select(x => x > 0);
于 2012-11-29T18:45:25.347 回答