我有一个类似ReactiveUI的视图模型。它有几个不同类型的属性可以触发NotifyPropertyChanged
个事件,我想订阅一个方法,当有人被触发时会被调用,但我对实际值不感兴趣。
我当前的代码有点难看(由于不透明的true
选择)。有没有办法表达这一点,这表明在事件发生时只关心他人的意图?
this.ObservableForProperty(m => m.PropertyOne)
.Select(_ => true)
.Merge(this.ObservableForProperty(m => m.PropertyTwo).Select(_ => true))
.Subscribe(...)
我正在合并8个属性,所以它比显示的更难看。
答案 0 :(得分:17)
由于这看起来像ReactiveUI,如何使用WhenAny运算符:
this.WhenAny(x => x.PropertyOne, x => x.PropertyTwo, (p1, p2) => Unit.Default)
.Subscribe(x => /* ... */);
一般来说,如果你组合了任意的Observable,你也可以使用非扩展方法更清楚地写这个:
Observable.Merge(
this.ObservableForProperty(x => x.PropertyOne).Select(_ => Unit.Default),
this.ObservableForProperty(x => x.PropertyTwo).Select(_ => Unit.Default),
this.ObservableForProperty(x => x.PropertyThree).Select(_ => Unit.Default)
).Subscribe(x => /* ... */);
另外,如果您订阅了ReactiveObject的每个属性,那么最好只使用:
this.Changed.Subscribe(x => /* ... */);
答案 1 :(得分:2)
你可以使它成为一种扩展方法,使意图更清晰:
public static IObservable<bool> IgnoreValue<T>(this IObservable<T> source)
{
return source.Select(_ => true);
}
...
this.ObservableForProperty(m => m.PropertyOne).IgnoreValue()
.Merge(this.ObservableForProperty(m => m.PropertyTwo).IgnoreValue())
.Subscribe(..);