2011-08-31 11 views
10

Tengo un ObservableCollection que necesito hacer referencia para un elemento específico. Si el ítem no está allí, necesito monitorearlo a través de Reactive Extensions para cuando aparecen los ítems, pero necesito ayuda para configurar el enunciado. Todavía no estoy familiarizado con la forma en que todas las extensiones de Linq están pensadas para funcionar, por lo que no estoy seguro de cómo hacerlo. ¿Alguien puede señalarme en la dirección correcta?Uso de Rx (extensiones reactivas) para ver el elemento específico en ObservableCollection

Para ilustrar mejor, necesito algo como lo siguiente:

public class myitem :INotifyPropertyChanged 
{ 
    private string _key; 
    private string _value; 

    public string key 
    { 
     get { return _key; } 
     set { _key = value; NotifyPropertyChanged("key"); } 
    } 

    public string myvalue 
    { 
     //proper getter/setter, blah, blah 
    } 
} 

ObservableCollection<myitem> _collection = mycollection; 
var x = Observable.FromEvent<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
    h => new NotifyCollectionChangedEventHandler(h), 
    h => _collection.CollectionChanged += h, 
    h => _collection.CollectionChanged -= h); 

string keywaitingfor = "thiskey"; 
string valuewaitingfor = x.Where(xx => xx.key == keywaitingfor).First().myvalue; 

Esto no es exactamente mi situación, pero es de esperar que pueda ver lo que estoy tratando de hacer. El ObservableCollection puede no contener elementos para comenzar, y los valores de las propiedades se presentan de forma asincrónica. Sé que la última línea no es correcta, necesito tener un Observable en el evento clase PropertyChanged dentro de una lambda ... pero todavía estoy confundido acerca de cómo obtener ese valuewaiting para cuando se cumplan ambas condiciones.

Respuesta

8

Añadir ReactiveUI a su proyecto, a continuación, puede utilizar la clase ReactiveCollection, que deriva de ObservableCollection de WPF . Entonces esto es fácil como un pastel:

theCollection.ItemsAdded 
    .Where(x => x.Key == "Foo") 
    .Subscribe(x => Console.WriteLine("Received Item!")); 
+3

ObservableCollection es una desafortunada elección de nombres ahora :(Esto es un bache en el camino cuando se hace entrenamiento con Rx. –

+0

Parece que es exactamente lo que necesitaré. – Random

+0

No me di cuenta de que ReactiveUI iba a ser una biblioteca tan extensa. se ve muy bien; solo desearía haberlo sabido hace unos meses, puede que no encaje en mi proyecto en este momento. Por lo tanto, aunque espero poder usarlo en el futuro, y es "una" respuesta, debe deseleccionarlo como la respuesta "aceptada". – Random

14

El genérico ObservableCollection no tiene nada que ver con la interfaz IObservable. Sin embargo, puede monitorear caso CollectionChanged de un ObservableCollection través de Rx usando lo siguiente:

ObservableCollection<SomeType> items = yourObserableCollection; 
var itemAddedObservable = Observable 
     .FromEventPattern<NotifyCollectionChangedEventArgs>(items, "CollectionChanged") 
     .Select(change => change.EventArgs.NewItems) 

esto le dará una notificación cada vez que artículo (s) se añaden a la ObservableCollection. Los elementos serán un IList no genérico, por lo que podemos convertirlo en un IEnumerable del SomeType subyacente y SelectMany en ese .AsObservable para obtener un nuevo flujo observable de los valores entrantes. Por último en el suscribir, se hace lo que quiere con el valor final (en lugar de utilizar la primera llamada de bloqueo):

var filteredAddedItem = from added in itemAddedObservable 
         from itemAdded in added.OfType<SomeType>().ToObservable() 
         where itemAdded.key = keywaitingfor 
         select itemAdded; 

var sub = filteredAddedItem.Subscribe(item => Console.WriteLine("Received " + item.myvalue)); 
+0

He editado mi pregunta anterior para que quede más clara. – Random

+0

+1. Una pregunta: tengo este ** _ keywaitingfor _ ** presente en otra colección. ¿Cómo busco o juego ** _ itemAdded.Key _ ** en esa otra colección? –

Cuestiones relacionadas