繁体   English   中英

C#可观察到的话题冷热

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM