多个 .WhenAny(...).ToPropertyEx(...) 调用是否应该相互覆盖?

Should multiple .WhenAny(...).ToPropertyEx(...) calls overwrite one another?

我有一个对象有两个 WhenAnyValues:

this.WhenAnyValue(x => x.SomeInt)
    .Select(x => "Bar" + x)
    .ToPropertyEx(this, x => x.SomeString);
                
this.WhenAnyValue(x => x.SomeInt)
    .Select(x => "Foo" + x)
    .ToPropertyEx(this, x => x.SomeString);

使用 1-4 作为输入进行测试产生:

1
Foo0
Foo1
2
Foo2
3
Foo3
4
Foo4

交换 WhenAnyValue 方法的顺序,使 Bar 排在最后,结果仅触发 Bars。所以似乎后来的 WhenAnyValue 以某种方式覆盖了第一个。这是错误还是预期的行为?如果这是一个错误,这是来自 ReactiveUI 版本 16.3.10。

如果项目过滤时也会出现此问题,例如,Foo 仅设置为偶数,而 Bar 仅设置为奇数。你仍然只会得到最后一个被调用的WhenAnyValue

Foo0是延迟执行造成的,与此问题无关

问题不在于 WhenAnyValue() 调用,它可以在同一个 属性 上多次使用,并且它们中的每一个都会单独触发观察值变化。问题是 ToPropertyEx() 调用或它重定向到的基础 ToProperty() 调用。

ToProperty()ToPropertyEx()的要点是为特定目标属性(此处SomeString)构建价值订阅。它将配置订阅并在值更改时触发 PropertyChanged 事件。 getter 你的 SomeString 属性 将链接到一个生成的 ObservableAsPropertyHelper<T> 实例,或者使用

这样的显式代码
public string SomeString => this.someString.Value;

(其中 this.someString 属于 ObservableAsPropertyHelper<string> 类型) 或使用 Reactive.Fody 库的属性 [ObservableAsProperty],如

[ObservableAsProperty]
public string SomeString {get;}

只能配置一个“getter”,它是来自“Bar”订阅或“Foo”订阅的 ObservableAsPropertyHelper 版本。请记住,生成的 PropertyChangedEvent 事件不包含实际值,仅包含更改的 属性 名称。订阅者必须从某个地方获取值,他们使用 属性.

的 getter