2011-08-31 10 views
10

Ho un ObservableCollection che ho bisogno di fare riferimento a un elemento specifico. Se l'elemento non è presente, ho bisogno di monitorarlo tramite Reactive Extensions per se/quando appare la voce, ma ho bisogno di aiuto per impostare la dichiarazione. Non ho ancora familiarità con il modo in cui tutte le estensioni Linq sono destinate a funzionare, quindi non sono sicuro di come farlo. Qualcuno può indicarmi la giusta direzione?Utilizzando Rx (Reactive Extensions) per guardare per elemento specifico in ObservableCollection

Per illustrare meglio, ho bisogno di qualcosa di simile al seguente:

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; 

Questo non è esattamente il mio scenario, ma spero che si può vedere quello che sto cercando di fare. ObservableCollection potrebbe non contenere elementi da iniziare e i valori della proprietà vengono visualizzati in modo asincrono. So che l'ultima riga non è corretta, ho bisogno di avere un Observable sull'evento PropertyChanged della classe all'interno di una lambda ... ma sono ancora confuso su come ottenere quel valore per quando entrambe le condizioni sono soddisfatte.

risposta

8

Aggiungi ReactiveUI al progetto, quindi è possibile utilizzare la classe ReactiveCollection, che deriva da ObservableCollection di WPF . Quindi questo è facile come torta:

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

ObservableCollection è una sorta di una scelta di denominazione infelice ora :(Questo è urto nella strada quando si fa formazione Rx. –

+0

Sembra proprio quello che avrò bisogno. – Random

+0

Non mi rendevo conto ReactiveUI stava per essere una vasta libreria tale. E ' sembra fantastico, vorrei solo averlo saputo qualche mese fa, potrebbe non adattarsi al mio progetto a questo punto, quindi, mentre spero di poterlo usare in futuro, ed è una risposta "una", io è necessario deselezionarlo come risposta "accettata" – Random

14

L'ObservableCollection generica non ha nulla a che fare con l'interfaccia IObservable. È tuttavia possibile monitorare evento CollectionChanged di un ObservableCollection attraverso Rx utilizzando il seguente:

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

questo vi darà una notifica ogni volta item (s) vengono aggiunti al ObservableCollection. Gli oggetti saranno un IList non generico, quindi possiamo lanciarli su un oggetto IEnumerable di SomeType e SelectMany sottostanti. È possibile visualizzare un nuovo flusso osservabile dei valori in entrata. Infine, nella Iscriviti, fai quello che vuoi con il valore finale (invece di utilizzare il blocco prima convocazione):

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

Ho modificato la mia domanda sopra per essere più chiara. – Random

+0

+1. Una domanda: ho questo ** keywaiting per _ ** presente in un'altra raccolta. Come faccio a cercare o abbinare ** _ itemAdded.Key _ ** in quell'altra raccolta? –

Problemi correlati