无法在ReactiveList <t> </t>上侦听ItemChanged,ItemsAdded或ItemsRemoved

时间:2014-02-27 01:08:36

标签: observablecollection reactiveui

我有一个ReactiveObject,其属性“A”的类型为“ReactiveList”。

在我的ViewModel中,我想对列表中每个项目的“T”属性求和。 我得到了它,而“A”没有改变它的价值。

但是当我为“A”分配一个新值时,所有这些都会“不同步”(例如this.A = new ReactiveList();)。

有谁知道如何解决这个问题?我希望我能够清楚地解释我的问题。

2 个答案:

答案 0 :(得分:1)

不要直接听A,而是听this

this.WhenAnyObservable(x => x.A.ItemsChanged).Subscribe(...);

每当A改变时,你都会重新订阅A.现在,知道何时重置为总和,这有点棘手。这是一种懒惰但更加万无一失的方法:

Observable.Merge(
    this.WhenAny(x => x.A, _ => Unit.Default),
    this.WhenAnyObservable(x => x.Changed).Select(_ => Unit.Default))
.Select(_ => this.A.Sum(x => x.SomePropOnTheItem))
.DistinctUntilChanged()
.Subscribe(x => Console.WriteLine("Latest sum is {0}", x);

答案 1 :(得分:1)

1 - 我会避免将集合作为逻辑的一部分连续分配,而是使用Clear()。哪个应该对GC有相同的影响。

2-如果绝对必要,在主要对象A上使用SerialDisposable和subsribe

this.ObservableForProperty(p=> p.A).Subscribe(newAvalue=>{
   someSerialDisposable.Disposable=
        newAvalue.Changed.Subscribe(_=>this.Result=this.A.Sum(x=>x.T))
});

这会在A个实例上处理以前的深度订阅。