Реализуйте свойства Lazy и Reactive во ViewModel, используя ReactiveUI - PullRequest
1 голос
/ 16 апреля 2019

В настоящее время у меня есть ViewModel, где я реализую (вручную) модель инициализации «Ленивый» (код ниже).

Идея состоит в том, что у меня есть конвейер данных, и я хочу отобразить некоторые из его промежуточныхРезультаты в представлении.И, что очень важно, я хочу, чтобы свойства были ленивыми, чтобы они «вытягивались» из ViewModel только тогда, когда View вызывает их метод получения.

Текущий шаблон отлично работает для одного «прогона» вычислений, но так как каждый шаг вычисления зависит от некоторых числовых параметров, и я хочу отразить изменение значений параметров ниже по потоку, таким образом, обновляя значения и отображение соответственно, я хотел бы раз и навсегда понять способ сделать это вReactiveUI.

Я предполагаю, что некоторые шаблоны, включающие ReactiveObject, WhenAny, WhenAnyValue и ObservableAsPropertyHelper, должны быть общими, но это похоже на четвертый способ, которым я пытаюсь делать подобные вещи, и я всегдатрудно понять концепции.

public class OldViewModel : ViewModelBase
{
    public IEnumerable<double> EnvelopeEmg 
        => _envelopeEmg ??
           (_envelopeEmg = Algoritmos.CriarEnvelopeEmg(_model.Emg));
    IEnumerable<double> _envelopeEmg;

    public IEnumerable<DataPoint> EnvelopeSeries
        => _envelopeSeries ?? 
           (_envelopeSeries = Algoritmos.CriarEnvelopeSeries(EnvelopeEmg));
    IEnumerable<DataPoint> _envelopeSeries;


    public ExameErgoEmgViewModel(ExameErgoEmg model)
    {
        _model = model;
    }
}

public class NewViewModel : ReactiveObject
{
    public IEnumerable<double> EnvelopeEmg { get; }
    IEnumerable<double> _envelopeEmg;   /// OAPH here?

    public IEnumerable<DataPoint> EnvelopeSeries { get; }
    IEnumerable<DataPoint> _envelopeSeries;   /// OAPH here?


    public ExameErgoEmgViewModel(ExameErgoEmg model)
    {
        _model = model;

        // ????
        // What should be initialized here? And how?
        // How to lazily get the first value of EnvelopeEmg?
        // How to reflect changes in EnvelopeEmg to EnvelopeSeries property?
    }
}    
...