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

Rus*_*den 2 c# reactiveui

我有一个有两个的对象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);

Run Code Online (Sandbox Code Playgroud)

使用 1-4 作为输入进行测试,得出:

1
Foo0
Foo1
2
Foo2
3
Foo3
4
Foo4
Run Code Online (Sandbox Code Playgroud)

交换方法的顺序WhenAnyValue,使 Bar 出现在最后,会导致仅触发 Bar。所以看来后者WhenAnyValue在某种程度上覆盖了第一个。这是一个错误还是有意的行为?如果这是一个错误,那么它来自 ReactiveUI 版本 16.3.10。

如果对项目进行过滤,例如,仅将 Foo 设置为偶数值,将 Bar 仅设置为奇数值,也会出现此问题。您仍然只能得到WhenAnyValue最后被调用的那个。

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

Pro*_*man 5

问题不在于WhenAnyValue()调用,它可以在同一属性上多次使用,并且每次调用都会分别触发观察到的值更改。问题在于ToPropertyEx()调用或其重定向到的底层ToProperty()调用。

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

public string SomeString => this.someString.Value;
Run Code Online (Sandbox Code Playgroud)

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

[ObservableAsProperty]
public string SomeString {get;}
Run Code Online (Sandbox Code Playgroud)

只能配置一个“getter”,它可以是ObservableAsPropertyHelper来自“Bar”订阅的构建,也可以是“Foo”订阅的构建。请记住,生成的PropertyChangedEvent事件不携带实际值,仅携带已更改的属性名称。订阅者必须从某个地方获取值,并且他们使用该属性的 getter。