WhenAny
不是用于跨任意可观察值集进行监视,而是用于监视 ReactiveUI 支持的对象的属性(例如 ReactiveObject 或反应式集合)。
对于组合可观察流中的变化的一般情况,Observable.Merge
是正确的方法。
EDIT
我注意到您已将 Data 和 MyCol 属性声明为只读。如果您使用Merge
像这样:
Observerable.Merge(this.WhenAnyValue(o=>o.IsTrue, v=>Unit.Default),
this.Data,
this.MyCol.CollectionChanged.Select(v=>Unit.Default))
...那么您必须小心不要更改支持字段。如果你这样做,那么你会丢失事件 - 也许这就是正在发生的事情?
在这种情况下,您需要将这些属性连接到RaiseAndSetIfChanged
并使用Switch
跟踪 - 例如如果this.data
可以更改然后您需要(我在这里使用 ReactiveUI 5 + .NET 4.5,以防 RaiseAndSetIfChanged 语法看起来很奇怪):
public IObservable<Unit> Data
{
get { return this.data; }
private set { this.RaiseAndSetIfChanged(ref data, value); }
}
你的合并将是这样的:
Observerable.Merge(this.WhenAnyValue(o=>o.IsTrue, v=>Unit.Default),
this.WhenAnyObservable(x => x.Data),
this.MyCol.CollectionChanged.Select(v=>Unit.Default))
WhenAnyObservable 在概念上等价于:
WhenAny(x => x.Data, vm => vm.Value).Switch()
使用 Switch 翻转到最新值Data
当它改变时。不要忘记使用设置器来更改数据值!