发出值只有当某些条件得到满足,否则发出另一个vlaue

发出值只有当某些条件得到满足,否则发出另一个vlaue

问题描述:

我有一个视图模型有以下几点:发出值只有当某些条件得到满足,否则发出另一个vlaue

enum Detection {NotTriggered, Triggered};

public Detection AlertState => _alertState.Value;

public DateTimeOffset? LastAlertTime => _lastAlertTime.Value;

我想怎么办有另一个属性:int AcknowledgementPriority {get;}默认情况下返回0。不过,如果AlertState变成Triggered,并且LastAlertTime有效时间,我想要一个计时器。该计时器在30秒后将AcknowledgementPriority设置为1。如果AlertState在任何时间点变为NotTriggered,则AcknowledgementPriority将再次变为0

我很确定我可以使用像Observable.From(1).Delay(Timespan.FromSeconds(30))这样的“计时器”部分,但我正在努力与Rx的方式做到这一点。

谢谢。

我认为你在寻找这样的事情:

public class TestVm : ReactiveObject 
{ 
    public enum Detection { NotTriggered, Triggered }; 

    readonly ObservableAsPropertyHelper<Detection> _alertState; 
    public Detection AlertState => _alertState.Value; 

    readonly ObservableAsPropertyHelper<DateTimeOffset> _lastAlertTime; 
    public DateTimeOffset? LastAlertTime => _lastAlertTime.Value; 

    readonly ObservableAsPropertyHelper<int> _acknowledgementPriority; 
    public int AcknowledgementPriority => _acknowledgementPriority.Value; 

    public TestVm() 
    { 
     this.WhenAnyValue(x => x.AlertState, x => x.LastAlertTime) 
      .Where(t => t.Item2.HasValue)        //If LastAlertTime has a valid time 
      .Select(t => t.Item1 == Detection.Triggered     //a timer that kicks off if AlertState becomes Triggered 
       ? Observable.Return(1).Delay(TimeSpan.FromSeconds(30)) //Timer would after 30 seconds set AcknowledgementPriority to 1 
       : Observable.Return(0)         //If AlertState becomes NotTriggered at any point in time then AcknowledgementPriority would become 0 again 
      ) 
      .Switch() 
      .StartWith(0)            //that returns 0 by default 
      .ToProperty(this, x => x.AcknowledgementPriority, out _acknowledgementPriority); 
    } 

} 

Switch的关键在于:它发生在可观察到的观测量和“开关”的最新观测到发射。