2011-01-18 4 views
6

List<int> 또는 Dictionary<x,x>과 같은 콜렉션을 관찰하려고합니다. Rx 프레임 워크에서 .net 4의 첫 번째 단계를 밟고 있습니다. 그리고 항목이 컬렉션에 추가되면 콘솔에 ToString()으로 기록됩니다.소장품에있는 관찰자

어떤 아이디어가 있습니까? 또는 일부 코드 샘플

답변

9

List<T>Dictionary<TKey, TValue>은 관찰 할 수 없으며 (변경시 이벤트를 발생시키지 않음) 수신을 위해 아무 것도 연결되지 않습니다.

List의 경우 ObservableCollection<T>을 사용할 수 있지만 Rx에서 사용하려면 해당 이벤트를 래핑해야합니다.

ObservableCollection<int> collection = 
    new ObservableCollection<int>(new int[] { 1, 2, 3 }); 

collection.GetObservableAddedValues().Subscribe(
    i => Console.WriteLine("{0} was added", i) 
); 

더있다 : 난 단지 당신이 이런 식으로 사용하지 수 IObservable<T>로 새로 추가 된 항목을 노출하는 추가 도우미를 포함 시켰습니다

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>()); 
    } 
} 

예를 들면 다음과 같습니다 사용하여 확장 방법이다 관측 할 수있는 사전 프레임 워크에서 비록 그 균열을 메꾸기 위해 ObservableDictionary codeplex project이 나타나지만 나는 비슷한 방법으로 감쌀 수 있다고 확신한다. ReactiveUI에서

1

사용 ReactiveCollection :

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

당신이 그것을 시도? 대신 observbleCollection을 사용하지 않는 이유는 무엇입니까? – guyl

관련 문제