使用Rx(Reactive Extensions)监视ObservableCollection中的特定项

我有一个ObservableCollection,我需要引用一个特定的项目。 如果该项目不存在,我需要通过Reactive Extensions监视它是否/何时出现项目,但在设置语句时需要一些帮助。 我仍然不熟悉所有不同的Linq扩展是如何工作的,所以我不知道如何做到这一点。 谁能指出我正确的方向?

为了更好地说明,我需要类似以下内容:

public class myitem :INotifyPropertyChanged { private string _key; private string _value; public string key { get { return _key; } set { _key = value; NotifyPropertyChanged("key"); } } public string myvalue { //proper getter/setter, blah, blah } } ObservableCollection _collection = mycollection; var x = Observable.FromEvent( h => new NotifyCollectionChangedEventHandler(h), h => _collection.CollectionChanged += h, h => _collection.CollectionChanged -= h); string keywaitingfor = "thiskey"; string valuewaitingfor = x.Where(xx => xx.key == keywaitingfor).First().myvalue; 

这不完全是我的情景,但希望你能看到我正在尝试做的事情。 ObservableCollection可能不包含任何要开始的项,并且属性值是异步的。 我知道最后一行是不对的,我需要在一个lambda中的类PropertyChanged事件上有一个Observable …但我仍然对如何在满足两个条件时获得该值等待感到困惑。

将ReactiveUI添加到项目中,然后可以使用ReactiveCollection类,该类派生自WPF的ObservableCollection。 馅饼很简单:

 theCollection.ItemsAdded .Where(x => x.Key == "Foo") .Subscribe(x => Console.WriteLine("Received Item!")); 

通用的ObservableCollection与IObservable接口无关。 但是,您可以使用以下命令通过Rx监视ObservableCollection的CollectionChanged事件:

 ObservableCollection items = yourObserableCollection; var itemAddedObservable = Observable .FromEventPattern(items, "CollectionChanged") .Select(change => change.EventArgs.NewItems) 

只要将项添加到ObservableCollection,这将为您提供通知。 这些项将是一个非genericsIList,因此我们可以将其转换为底层SomeType和SelectMany的IEnumerable .AsObservable以获取传入值的新的可观察流。 最后在订阅中,您可以使用最终值执行所需操作(而不是使用阻塞First调用):

 var filteredAddedItem = from added in itemAddedObservable from itemAdded in added.OfType().ToObservable() where itemAdded.key = keywaitingfor select itemAdded; var sub = filteredAddedItem.Subscribe(item => Console.WriteLine("Received " + item.myvalue));