如果另一个属性正在更改,我试图避免对某个属性进行更新。因此,我想出了以下内容(在ViewModel中):
this.WhenAnyObservable(
x => x.WhenAnyValue( y => y.Asset.CurrentValuation ),
x => x.Changing,
(currentValuation, changing) => changing.PropertyName != "CurrentValuationCalculated"
)
但是,ReactiveUI在ExpressionRewriter.VisitMethodCall
内引发以下错误:
throw new NotSupportedException("Index expressions are only supported with constants.")
如果我删除了WhenAnyValue
行,它将起作用。所以我假设这与WhenAnyValue
中的表达式有关?
如果不深入研究ExpressionRewriter
代码的实际作用,它在抱怨什么?我犯了一些简单的错误吗?
更新
所以我输入了这个:
this.WhenAnyObservable(
x => x.Asset.CurrentValuation,
x => x.Changing,
( currentValuation, changing ) => changing.PropertyName != "CurrentValuationCalculated"
)
但是,编译器抱怨x.Asset.CurrentValuation
并说:
Cannot implicitly convert type 'decimal?' to 'System.IObservable<ReactiveUI.IReactivePropertyChangedEventArgs<ReactiveUI.IReactiveObject>>'
答案 0 :(得分:0)
答案是肯定的。
更长的答案是WhenAnyObservable
会为您提供更改通知,因此您实际上并不需要WhenAnyValue
。通常,您可以在ViewModel属性上使用WhenAnyValue
来强制订阅更改通知。可观察到的顺序本质上是通过OnNext
以下通知我正在观察IObservable
中的WhenAnyObservable
和WhenAnyValue
中的视图模型属性。您无需在对WhenAnyObservable
的调用中解包该值即可获取该值。
public class MainViewModel : ReactiveObject
{
private string _property;
public IObservable<bool> MyObservabe { get; }
public string MyProperty { get => _property; set => this.RaiseAndSetIfChanged(ref _property, value); }
public MainViewModel()
{
MyObservabe = Observable.Interval(TimeSpan.FromSeconds(1)).Select(x => x > 5);
this.WhenAnyObservable(x => x.MyObservabe);
this.WhenAnyValue(x => x.MyProperty);
}
}