gpt4 book ai didi

system.reactive - 如何在 ReactiveUI 中使用 WhenAny(...) 合并多个 observables?

转载 作者:行者123 更新时间:2023-12-01 08:59:12 36 4
gpt4 key购买 nike

我有一个问题,它是本网站上提出的以下问题的扩展。

Is there a more elegant way to merge observables when return type is unimportant?

我有一个 IObservable<Unit> (比方说 X )、响应式(Reactive)集合( Y )和属性( Z )。返回类型并不重要。我只想在这些更改中的任何一个时订阅。

我知道如何观察所有 3 和 Subscribe使用 Observable.Merge如下。

Observable.Merge(X, Y.Changed, ObservableForProperty(Z).Select(_ => Unit.Default)).Subscribe(..)

它有效。

但是,当我尝试使用 WhenAny(...,....,....).Subscribe() 时, 当我的 X 订阅不会被触发变化。使用 WhenAny(...) 执行上述操作的语法是什么?而不是 Observable.Merge(..) ??

我更喜欢使用 WhenAny(....)因为我正在使用 ReactiveUI在其他地方。

例子:
假设我有一个派生自 ReactiveObject 的类具有以下属性。
public class AnotherVM : ReactiveObject
{
public bool IsTrue
{
get { return this.isTrue; }
set { this.RaiseAndSetIfChanged(x => x.isTrue, ref this.isTrue, value); }
}

public IObservable<Unit> Data
{
get { return this.data; }
}

public ReactiveCollection MyCol
{
get { return Mycol; }
}
}

public class MyVM : ReactiveObject
{
MyVM
{
// do WhenAny or Observable.Merge here....
}
}

我想在 AnotherVM中观察以上属性类使用 Observable.Merge(..)WhenAny(...)MyVM类(class)。我发现在 MyVM 订阅上述内容时,我并不总是收到通知使用 WhenAny(...)Merge(...)当 3 个属性中的任何一个发生变化时。

最佳答案

WhenAny不是用于跨任意 observable 集进行监控,而是用于监控 ReactiveUI 支持的对象的属性(如 ReactiveObject 或响应式(Reactive)集合)。

对于组合可观察流中的变化的一般情况,Observable.Merge是正确的方法。

编辑

我注意到您已将 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 的最新值当它改变时。不要忘记使用 setter 来更改数据的值!

关于system.reactive - 如何在 ReactiveUI 中使用 WhenAny(...) 合并多个 observables?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21777417/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com