List<T>
y Dictionary<TKey, TValue>
no son observables (no generan eventos cuando cambian), por lo que Rx no tiene nada que enganchar.
Para List
, puede usar ObservableCollection<T>
, pero deberá envolver sus eventos para usarlo desde Rx. Este es un ejemplo utilizando los métodos de extensión:
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>());
}
}
que he incluido un ayudante adicional que sólo expone los elementos recién agregado como una IObservable<T>
, que se puede utilizar de esta manera:
ObservableCollection<int> collection =
new ObservableCollection<int>(new int[] { 1, 2, 3 });
collection.GetObservableAddedValues().Subscribe(
i => Console.WriteLine("{0} was added", i)
);
No hay Diccionario observable en el marco, aunque el ObservableDictionary codeplex project parece llenar ese vacío y estoy seguro de que podría ser envuelto de una manera similar.
has probado? y ¿por qué no usar observbleCollection en su lugar? – guyl