我有一个带有两个 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/