[英]c# Observable subject hot and cold
我经常遇到这样的情况:我希望UI元素“监视”一个基础值-假设我正在显示一个整数-我想要一个我可以订阅的IObservable。
我一直在下面使用一个主题,所以我可以设置它。 效果很好……除了第一次。 如果我设置了主题-然后稍后通过打开一个新的UI元素来订阅它-它不会触发onnext直到下一次更改。
我基本上想要一种像主题一样工作的东西-但总是对所有新订阅者立即执行最新值的onNext。
我知道我可以自己编写这样的构造-但似乎是一个常见的用例-我缺少某些标准吗?
您需要BehaviorSubject<T>
或ReplaySubject<T>
。
BehaviorSubject<T>
重播最近的单个值,并要求您在构造函数中提供一个初始值。
您可以这样使用它:
var bs = new BehaviorSubject<int>(0);
bs.Subscribe(x => Console.WriteLine(x));
bs.OnNext(42);
bs.Subscribe(x => Console.WriteLine(x));
那将输出0
,然后是42
,然后是42
到控制台。
ReplaySubject<T>
有点一般。 它允许您指定要重播的值的数量,但不强制您提供初始值。
var rs = new ReplaySubject<int>(1);
rs.Subscribe(x => Console.WriteLine(x));
rs.OnNext(42);
rs.Subscribe(x => Console.WriteLine(x));
这产生42
,然后42
到控制台。
将此与标准Subject<T>
。
var s = new Subject<int>();
s.Subscribe(x => Console.WriteLine(x));
s.OnNext(42);
s.Subscribe(x => Console.WriteLine(x));
那只产生42
。
如果在UI中使用Rx,则应查看ReactiveUI 。
它具有方便的扩展名.ToProperty
等:
_isValid = this.WhenAnyValue(x => x.Username, x => x.Password, (user, password) => !string.IsNullOrEmpty(user) && !string.IsNullOrEmpty(password)).ToProperty(this, x => x.IsValid);
public bool IsValid => _isValid.Value;
这基本上就是您正在做的事情:
this.WhenAnyValue(x => x.Property)
=>属性为可观察 obs.ToProperty()
=>可观察到可以绑定到UI的属性 都可以使用INotifyPropertyChanged
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.