2011-08-31 44 views
10

我有一個ObservableCollection,需要爲特定項目引用。如果項目不存在,我需要通過Reactive Extensions來監控它是否出現在項目中,但是在設置聲明時需要一些幫助。我仍然不熟悉所有不同的Linq擴展是如何工作的,所以我不知道如何做到這一點。任何人都可以將我指向正確的方向嗎?使用Rx(Reactive Extensions)觀察ObservableCollection中的特定項目

爲了更好地說明,我需要像下面這樣:

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; 

這不完全是我的方案,但希望你能看到我想要做的事。 ObservableCollection可能不包含任何項目開始,並且屬性值異步進入。我知道最後一行是不正確的,我需要在lambda類中的類PropertyChanged事件上有一個Observable ...但我仍然對如何在滿足兩個條件時獲得該值的等待感到困惑。

回答

8

添加ReactiveUI到您的項目,那麼你可以使用ReactiveCollection類,從WPF的的ObservableCollection派生。然後這很容易:

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

ObservableCollection現在是一種不幸的命名選擇:(這是在做Rx訓練時碰到的道路 –

+0

看起來就像我需要的那樣 – Random

+0

我沒有意識到ReactiveUI會成爲如此龐大的庫。看起來不錯,我只是希望在幾個月前知道它,這個時候它可能不適合我的項目。所以,雖然我希望將來可以使用它,但這是「一個」的答案,我需要取消選擇它作爲「接受」的答案。 – Random

14

通用ObservableCollection與IObservable接口無關。您可以使用下列但是通過監控的Rx一個ObservableCollection的CollectionChanged事件:

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

這會給你一個通知,每當項目(S)被添加到的ObservableCollection。這些項目將是一個非通用的IList,因此我們可以將其轉換爲該.AsObservable上的底層SomeType和SelectMany的IEnumerable,以獲取新的可觀察的傳入值流。最後,在訂閱,你做你想要的終值(而不是使用阻塞第一次調用)什麼:

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

我編輯我的問題上面更清楚。 – Random

+0

+1。一個問題 - 我有這個** _ keywaitingfor _ **出現在另一個集合中。如何在其他集合中搜索或匹配** _ itemAdded.Key _ **? –

相關問題