List<T>
e Dictionary<TKey, TValue>
non sono osservabili (non generano eventi quando cambiano), quindi non c'è nulla per Rx nell'agganciarsi.
Per List
, è possibile utilizzare ObservableCollection<T>
, ma è necessario avvolgere gli eventi per utilizzarlo da Rx. Ecco un esempio che utilizzano metodi di estensione:
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>());
}
}
ho incluso un aiuto supplementare che espone solo gli elementi appena aggiunti come un IObservable<T>
, che è possibile utilizzare in questo modo:
ObservableCollection<int> collection =
new ObservableCollection<int>(new int[] { 1, 2, 3 });
collection.GetObservableAddedValues().Subscribe(
i => Console.WriteLine("{0} was added", i)
);
Non c'è Dizionario osservabile nel framework, anche se il ObservableDictionary codeplex project sembra riempire quel vuoto e sono sicuro che potrebbe essere avvolto in un modo simile.
fonte
2011-01-18 09:24:00
hai provato? e perché non usare invece observbleCollection? – guyl