List<int>
또는 Dictionary<x,x>
과 같은 콜렉션을 관찰하려고합니다. Rx 프레임 워크에서 .net 4의 첫 번째 단계를 밟고 있습니다. 그리고 항목이 컬렉션에 추가되면 콘솔에 ToString()
으로 기록됩니다.소장품에있는 관찰자
어떤 아이디어가 있습니까? 또는 일부 코드 샘플
List<int>
또는 Dictionary<x,x>
과 같은 콜렉션을 관찰하려고합니다. Rx 프레임 워크에서 .net 4의 첫 번째 단계를 밟고 있습니다. 그리고 항목이 컬렉션에 추가되면 콘솔에 ToString()
으로 기록됩니다.소장품에있는 관찰자
어떤 아이디어가 있습니까? 또는 일부 코드 샘플
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에서
사용 ReactiveCollection
:
var c = new ReactiveCollection<int>();
c.Changed.Subscribe(x => Console.Writeln(x.Value);
c.Add(1);
당신이 그것을 시도? 대신 observbleCollection을 사용하지 않는 이유는 무엇입니까? – guyl