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

时间:2017-04-03 19:38:36

标签: system.reactive reactiveui

我有一个ViewModel,其中包含以下内容:

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这样做。

感谢。

1 个答案:

答案 0 :(得分:1)

我认为你正在寻找这样的东西:

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并'切换'到最新发出的observable。