2011-01-18 14 views
6

Sto facendo i miei primi passi in Rx framework su .net 4. sto cercando di osservare una collezione come List<int> o Dictionary<x,x>. e quando un elemento viene aggiunto alla raccolta lo scriverà nella console ToString().osservatore su una collezione

qualche idea? o alcuni esempi di codice grazie

risposta

9

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.

1

Usa ReactiveCollection da ReactiveUI:

var c = new ReactiveCollection<int>(); 
c.Changed.Subscribe(x => Console.Writeln(x.Value); 
c.Add(1); 
+0

hai provato? e perché non usare invece observbleCollection? – guyl

Problemi correlati