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

C# 使用ReactiveUI在ViewModel中实现惰性和反应性属性,c#,wpf,reactiveui,C#,Wpf,Reactiveui,我目前有一个ViewModel,我在其中手动实现了“惰性”初始化模型(下面的代码) 我的想法是,我有一个数据管道,我想在视图中显示它的一些中间结果。而且,非常重要的是,我希望属性是惰性的,这样只有当视图调用它们的getter时,它们才会从ViewModel中“拉”出来 当前模式在一次“运行”计算中运行良好,但由于每个计算步骤都取决于一些数值参数,并且我希望反映管道下游参数值的变化,从而相应地更新值和显示,因此我希望一次性掌握在ReactiveUI中执行此操作的方法 我想涉及ReactiveObj

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

我的想法是,我有一个数据管道,我想在视图中显示它的一些中间结果。而且,非常重要的是,我希望属性是惰性的,这样只有当视图调用它们的getter时,它们才会从ViewModel中“拉”出来

当前模式在一次“运行”计算中运行良好,但由于每个计算步骤都取决于一些数值参数,并且我希望反映管道下游参数值的变化,从而相应地更新值和显示,因此我希望一次性掌握在ReactiveUI中执行此操作的方法

我想涉及
ReactiveObject
WhenAny
WhenAnyValue
observativePropertyHelper
的一些模式一定很常见,但这就像我尝试做这类事情的第四种方式,我总是很难理解这些概念

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?
    }
}    
公共类OldViewModel:ViewModelBase { 公共IEnumerable信封 =>\u信封emg?? (_envelopeEmg=Algoritmos.criarenevelopmg(_model.Emg)); IEnumerable _envelopeEmg; 公共可数包络线 =>\u信封系列?? (_envelopeSeries=Algoritmos.criarenevelopmeseries(EnvelopeEmg)); IEnumerable_信封系列; 公共ExameErgoEmgViewModel(ExameErgoEmg模型) { _模型=模型; } } 公共类NewViewModel:反应对象 { 公共IEnumerable信封emg{get;} IEnumerable\u envelopeEmg;///这里是OAPH吗? 公共IEnumerable信封系列{get;} IEnumerable\u信封系列;///这里是OAPH吗? 公共ExameErgoEmgViewModel(ExameErgoEmg模型) { _模型=模型; // ???? //这里应该初始化什么?如何初始化? //如何懒洋洋地获得EnvelopeEmg的第一个值? //如何将EnvelopeEmg中的更改反映到EnvelopeSeries属性? } }
您可以将envelopeEmg设置为oaph,当您在具有TopProperty的构造函数中设置它时,请将DeferSubscrOption参数设置为true。这将实现惰性第一值功能。您可以将envelopeEmg设置为oaph,并在使用TopProperty的构造函数中设置它时,将DeferreSubscrOption参数设置为true。这将实现惰性第一值功能。