仅当满足某些条件时才发出一个值,否则发出另一个值
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
变为 Triggered
且 LastAlertTime
具有有效时间,我想要一个计时器启动。该计时器将在 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。
我有一个包含以下内容的 ViewModel:
enum Detection {NotTriggered, Triggered};
public Detection AlertState => _alertState.Value;
public DateTimeOffset? LastAlertTime => _lastAlertTime.Value;
我想做的是有另一个 属性: int AcknowledgementPriority {get;}
默认情况下 returns 0
。但是,如果 AlertState
变为 Triggered
且 LastAlertTime
具有有效时间,我想要一个计时器启动。该计时器将在 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。