guy*_*uyl 7 c# system.reactive
我正在使用.net 4上的Rx框架中的第一步.我正在尝试观察像List<int>或的集合Dictionary<x,x>.当一个项目被添加到集合中时,它将ToString()在控制台中写入它.
有任何想法吗 ?或者一些代码样本谢谢
Ric*_*lay 11
List<T>并且Dictionary<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>());
}
}
Run Code Online (Sandbox Code Playgroud)
我已经包含了一个额外的帮助程序,只显示新添加的项目IObservable<T>,您可以像这样使用:
ObservableCollection<int> collection =
new ObservableCollection<int>(new int[] { 1, 2, 3 });
collection.GetObservableAddedValues().Subscribe(
i => Console.WriteLine("{0} was added", i)
);
Run Code Online (Sandbox Code Playgroud)
虽然ObservableDictionary codeplex项目似乎填补了这个空白,但我确信它可以以类似的方式包装,但框架中没有可观察的字典.
| 归档时间: |
|
| 查看次数: |
7135 次 |
| 最近记录: |