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

标签 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);

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

1
Foo0
Foo1
2
Foo2
3
Foo3
4
Foo4

交换 WhenAnyValue 方法的顺序,使 Bar 出现在最后,导致仅触发 Bar。因此,后面的 WhenAnyValue 似乎以某种方式覆盖了第一个。这是一个错误还是有意的行为?如果这是一个错误,这是来自 ReactiveUI 版本 16.3.10。

如果项目被过滤,例如,Foo 仅设置为偶数,Bar 仅设置为奇数。您仍然只能得到最后被调用的 WhenAnyValue

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

最佳答案

问题不在于 WhenAnyValue()调用,它可以在同一属性上多次使用,并且每次调用都会分别触发观察到的值变化。问题是ToPropertyEx()看涨或标的ToProperty()称其为重定向至。

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

public string SomeString => this.someString.Value;

(其中 this.someString 的类型为 ObservableAsPropertyHelper<string> ) 或使用属性 [ObservableAsProperty] Reactive.Fody的类似图书馆

[ObservableAsProperty]
public string SomeString {get;}

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

关于c# - 多个 .WhenAny(...).ToPropertyEx(...) 调用是否应该相互覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70129169/

相关文章:

reactiveui - 如何在 ReactiveUI 6.0 中正确编码 UI 线程

c# - ContentControl 未更新

c# - 每个实体的 Web API OData 安全性

c# - 如何创建自定义数据网格

swift - 如何修复由于未捕获的异常 'RLMException' 、原因 : 'Realm accessed from incorrect thread.' ? 而终止应用程序

c# - 使用 ObservableAsPropertyHelper 激活/停用

c# - 加入 Linq 的最佳方式

c# - WPF ItemsControl 中的重叠项

c# - 为什么在我的新类(class)中创建事件时出现错误?

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