C# 使用Rx(反应式扩展)监视ObservableCollection中的特定项

C# 使用Rx(反应式扩展)监视ObservableCollection中的特定项,c#,linq,observablecollection,system.reactive,C#,Linq,Observablecollection,System.reactive,我有一个可观察的集合,我需要为特定的项目引用它。如果项目不在那里,我需要通过被动扩展来监控项目是否/何时出现,但需要一些设置语句的帮助。我仍然不熟悉所有不同的Linq扩展是如何工作的,所以我不确定如何做到这一点。谁能给我指出正确的方向吗 为了更好地进行说明,我需要做如下工作: public class myitem :INotifyPropertyChanged { private string _key; private string _value; public s

我有一个可观察的集合,我需要为特定的项目引用它。如果项目不在那里,我需要通过被动扩展来监控项目是否/何时出现,但需要一些设置语句的帮助。我仍然不熟悉所有不同的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;
ObservableCollection<SomeType> items = yourObserableCollection;
var itemAddedObservable = Observable
         .FromEventPattern<NotifyCollectionChangedEventArgs>(items, "CollectionChanged")
         .Select(change => change.EventArgs.NewItems)
公共类myitem:INotifyPropertyChanged
{
私钥;
私有字符串_值;
公共字符串密钥
{
获取{return\u key;}
设置{u key=value;NotifyPropertyChanged(“key”);}
}
公共字符串myvalue
{
//适当的吸气剂/设置剂,诸如此类
}
}
ObservableCollection _collection=mycollection;
var x=可观测的FromEvent(
h=>新的NotifyCollectionChangedEventHandler(h),
h=>\u collection.CollectionChanged+=h,
h=>\u collection.CollectionChanged-=h);
字符串keywaitingfor=“thiskey”;
字符串valuewaitingfor=x.Where(xx=>xx.key==keywaitingfor).First().myvalue;

这不完全是我的设想,但希望你能看到我在尝试做什么。ObservableCollection可能不包含要开始的项,并且属性值以异步方式输入。我知道最后一行是不对的,我需要在lambda中的类PropertyChanged事件上有一个可观察的。。。但是我仍然对如何在两个条件都满足时获取等待的值感到困惑。

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

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;
ObservableCollection<SomeType> items = yourObserableCollection;
var itemAddedObservable = Observable
         .FromEventPattern<NotifyCollectionChangedEventArgs>(items, "CollectionChanged")
         .Select(change => change.EventArgs.NewItems)
ObservableCollection items=您的ObservableCollection;
var itemAddedObservable=可观测
.FromEventPattern(项目,“CollectionChanged”)
.Select(change=>change.EventArgs.NewItems)
每当将项添加到ObservableCollection时,这将给您一个通知。这些项将是一个非通用的IList,所以我们可以将其转换为基础SomeType的IEnumerable,并在该IEnumerable上选择Many.aObservable以获得传入值的新的可观察流。最后,在Subscribe中,您可以使用最终值执行您想要的操作(而不是使用阻塞第一个调用):

var filteredadedItem=from添加到itemAddedObservable中
从添加在added.OfType()中的itemAdded.ToObservable()中
其中itemAdded.key=keywaitingfor
选择已添加的项目;
var sub=filterededitem.Subscribe(item=>Console.WriteLine(“Received”+item.myvalue));

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

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

ObservableCollection现在是一种不幸的命名选择:(这是做Rx培训时遇到的困难。看起来正是我需要的。我没有意识到ReactiveUI将成为一个如此广泛的库。它看起来很棒;我只是希望几个月前就知道它,但现在它可能不适合我的项目。因此,虽然我希望将来可以使用它,但它是“一个”回答,我需要将其取消选择为“已接受”回答。你可以做的另一件事是将粘贴复制到你的项目中,并将所有RxApp.DeferredScheduler更改为DispatchersScheduler。Current@JonathanPeelReactiveCollection已被弃用-该库现在使用Roland Pheasant的DynamicData,它的功能要强大得多。+1.一个问题-我在另一个问题中提出了这个关键等待集合。如何搜索或匹配已添加的项。键入其他集合?