2011-01-18 12 views
6

Estoy dando mis primeros pasos en los marcos Rx en .net 4. estoy tratando de observar una colección como List<int> o Dictionary<x,x>. y cuando se agrega un artículo a la colección lo escribirá ToString() en la consola.observador en una colección

¿Alguna idea? o algunos ejemplos de código gracias

Respuesta

9

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.

1

Uso ReactiveCollection de ReactiveUI:

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

has probado? y ¿por qué no usar observbleCollection en su lugar? – guyl

Cuestiones relacionadas