我目前有一个ViewModel,用于手动实现“惰性”初始化模型(下面的代码)。
这个想法是我有一个数据管道,我想在View中显示它的一些中间结果。而且,非常重要的是,我希望这些属性是惰性的,以便仅在View调用其getter时才将它们从ViewModel中“拉出”。
当前模式对于一次“运行”计算都可以正常工作,但是由于每个计算步骤都取决于一些数字参数,因此我想在管道下游反映参数值的变化,从而相应地更新值和显示,我想一劳永逸地掌握在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?
}
}