我正在使用.net 4上的Rx框架中的第一步.
我正在尝试观察像List< int>这样的集合.或字典< x,x>.
当一个项目被添加到集合时,它将在控制台中将其写入ToString().
我正在尝试观察像List< int>这样的集合.或字典< x,x>.
当一个项目被添加到集合时,它将在控制台中将其写入ToString().
有任何想法吗 ?或一些代码示例
谢谢
解决方法
列表与LT; T>和词典< TKey,TValue>是不可观察的(当他们改变时他们不会引发事件),所以Rx没有任何东西可以挂钩.
对于List,您可以使用ObservableCollection<T>
,但是您需要将其事件包装起来以便从Rx中使用它.以下是使用扩展方法的示例:
public static class ObservableCollectionExtensions { public static IObservable<IEvent<NotifyCollectionChangedEventArgs>> GetObservableChanges<T>(this ObservableCollection<T> collection) { return Observable.FromEvent< NotifyCollectionChangedEventHandler,NotifyCollectionChangedArgs>( h => new NotifyCollectionChangedEventHandler(h),h => collection.CollectionChanged += h,h => collection.CollectionChanged -= h ); } public static IObservable<T> GetObservableAddedValues<T>( this ObservableCollection<T> collection) { return collection.GetObservableChanges() .Where(evnt => evnt.EventArgs.Action == NotifyCollectionChangedAction.Add) .SelectMany(evnt => evnt.EventArgs.NewItems.Cast<T>()); } }
我已经包含了一个额外的帮助程序,它只将新添加的项目公开为IObservable< T>,您可以像这样使用:
ObservableCollection<int> collection = new ObservableCollection<int>(new int[] { 1,2,3 }); collection.GetObservableAddedValues().Subscribe( i => Console.WriteLine("{0} was added",i) );
框架中没有可观察到的词典,尽管ObservableDictionary codeplex project似乎填补了这个空白,我确信它可以以类似的方式包装.