使用WhenAnyValue和WhenAnyObservable时遇到问题

时间:2018-12-18 22:33:03

标签: wpf reactiveui

如果另一个属性正在更改,我试图避免对某个属性进行更新。因此,我想出了以下内容(在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>>'

1 个答案:

答案 0 :(得分:0)

答案是肯定的。

更长的答案是WhenAnyObservable会为您提供更改通知,因此您实际上并不需要WhenAnyValue。通常,您可以在ViewModel属性上使用WhenAnyValue来强制订阅更改通知。可观察到的顺序本质上是通过OnNext

提供更改通知

编辑

以下通知我正在观察IObservable中的WhenAnyObservableWhenAnyValue中的视图模型属性。您无需在对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);
    }
}