Проблемы с использованием WhenAnyValue с WhenAnyObservable

Я пытаюсь избежать обновления свойства, если изменяется другое свойство. Итак, я придумал следующее (в моей 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>>'

person Mitkins    schedule 18.12.2018    source источник
comment
WhenAnyValue принимает только Property. Можете ли вы дважды проверить, y.Asset.CurrentValuation - это собственность, а НЕ метод?   -  person Cinchoo    schedule 19.12.2018
comment
Хороший вопрос, я не перепроверил. Однако Asset и Asset.CurrentValuation являются свойствами   -  person Mitkins    schedule 19.12.2018
comment
Что такое тип данных Asset.CurrentValuation?   -  person Cinchoo    schedule 19.12.2018
comment
Десятичное число, допускающее значение NULL   -  person Mitkins    schedule 19.12.2018
comment
попробуйте изменить x => x.WhenAnyValue( y => y.Asset.CurrentValuation ) на x => x.Asset.CurrentValuation, посмотрите, работает ли это.   -  person Cinchoo    schedule 19.12.2018


Ответы (1)


Короткий ответ - да.

Более длинный ответ WhenAnyObservable предоставит вам уведомление об изменении, поэтому WhenAnyValue вам действительно не нужен. Обычно вы используете WhenAnyValue в свойстве ViewModel, чтобы принудительно подписаться на уведомление об изменении. Наблюдаемая последовательность по своей сути обеспечивает уведомление об изменении через 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);
    }
}
person Rodney Littles    schedule 18.12.2018
comment
Вы можете привести пример, чтобы проиллюстрировать свой ответ? - person Mitkins; 19.12.2018
comment
Попробуйте сделать часть WhenAnyValue своим собственным свойством члена, а затем используйте это свойство. this.WhenAnyObservable (x = ›x.CurrentValuation, x =› x.Changing) - person Colt Bauman; 19.12.2018
comment
Я думал, что x.CurrentValuation было свойством, а не Observable, и поэтому вам пришлось использовать WhenAnyValue, чтобы превратить свойство в Observable. Как видно из этого ответа - stackoverflow.com/a/21342186/23401 - person Mitkins; 19.12.2018
comment
Но что, если я хочу получать актуальные значения каждого из них одновременно? Изначально у меня было только this.WhenAnyValue( x => x.Asset.CurrentValuation ). Но затем я хотел избежать Subscribe, если CurrentValuationCalculated находится в процессе изменения, что доступно только через свойство / наблюдаемое Changing - person Mitkins; 19.12.2018
comment
Хотя я думаю, что моя первоначальная логика ошибочна. Если для CurrentValuationCalculated установлено значение true, CurrentValuation будет вычисляться автоматически, но только после изменения CurrentValuationCalculated! Тем не менее, у меня сложилось впечатление, что исходное утверждение должно быть возможным - отсюда вопрос - person Mitkins; 19.12.2018
comment
Ответ на ваш вопрос: да, вы можете делать то, что хотите. WhenAnyValue выдаст наблюдаемую последовательность. Я думаю, ваша проблема с вашим обновлением заключается в том, что вы ищете x.Changing, который, как мне кажется, this меняется, и это должна быть модель просмотра. Вы можете сделать x.Property.Changing, чтобы посмотреть на изменяющееся свойство. - person Rodney Littles; 19.12.2018