仅当满足某些条件时才发出一个值,否则发出另一个值

Emit a value only when certain conditions are met, else emit another vlaue

我有一个包含以下内容的 ViewModel:

enum Detection {NotTriggered, Triggered};

public Detection AlertState => _alertState.Value;

public DateTimeOffset? LastAlertTime => _lastAlertTime.Value;

我想做的是有另一个 属性: int AcknowledgementPriority {get;} 默认情况下 returns 0。但是,如果 AlertState 变为 TriggeredLastAlertTime 具有有效时间,我想要一个计时器启动。该计时器将在 30 秒后将 AcknowledgementPriority 设置为 1。如果 AlertState 在任何时间点变为 NotTriggered 那么 AcknowledgementPriority 将再次变为 0

我很确定我可以在 "timer" 部分使用类似 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 是关键:它接受一个 Observable of Observables 和 'switches' 到最新发出的 observable。