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

Ran*_*dom 12 c# linq observablecollection system.reactive

我有一个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<myitem> _collection = mycollection;
var x = Observable.FromEvent<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
    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;
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*ley 14

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

ObservableCollection<SomeType> items = yourObserableCollection;
var itemAddedObservable = Observable
         .FromEventPattern<NotifyCollectionChangedEventArgs>(items, "CollectionChanged")
         .Select(change => change.EventArgs.NewItems)
Run Code Online (Sandbox Code Playgroud)

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

var filteredAddedItem = from added in itemAddedObservable
                        from itemAdded in added.OfType<SomeType>().ToObservable()
                        where itemAdded.key = keywaitingfor
                        select itemAdded;

var sub = filteredAddedItem.Subscribe(item => Console.WriteLine("Received " + item.myvalue));
Run Code Online (Sandbox Code Playgroud)


Ana*_*tts 8

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

theCollection.ItemsAdded
    .Where(x => x.Key == "Foo")
    .Subscribe(x => Console.WriteLine("Received Item!"));
Run Code Online (Sandbox Code Playgroud)

  • ObservableCollection现在是一个令人遗憾的命名选择:(这在进行Rx训练时会遇到麻烦. (3认同)