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