使用ReactiveUI在ViewModel中实现惰性和反应式属性

时间:2019-04-16 20:53:25

标签: c# wpf reactiveui

我目前有一个ViewModel,用于手动实现“惰性”初始化模型(下面的代码)。

这个想法是我有一个数据管道,我想在View中显示它的一些中间结果。而且,非常重要的是,我希望这些属性是惰性的,以便仅在View调用其getter时才将它们从ViewModel中“拉出”。

当前模式对于一次“运行”计算都可以正常工作,但是由于每个计算步骤都取决于一些数字参数,因此我想在管道下游反映参数值的变化,从而相应地更新值和显示,我想一劳永逸地掌握在ReactiveUI中执行此操作的方式。

我认为涉及ReactiveObjectWhenAnyWhenAnyValueObservableAsPropertyHelper的某种模式必须很常见,但这就像我尝试做这种事情的第四种方式一样,而且我总是很难理解这些概念。

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?
    }
}    

0 个答案:

没有答案