在我的ViewModel
我经常会遇到如下代码:
public bool IsDownloading { get { return _isDownloading.Value; } }
private ObservableAsPropertyHelper<bool> _isDownloading;
...
FileDownloader.WhenAny(x => x.IsDownloading, x => x.Value)
.ToProperty(this, x => x.IsDownloading, out _isDownloading, false, RxApp.MainThreadScheduler);
注意最后一个RxApp.MainThreadScheduler
参数 - 确保IsDownloading
属性的所有更新都发生在主UI线程上。
原因在于可能订阅它的原因。例如,在我的视图xaml中,我可能有以下代码:
this.OneWayBind(ViewModel, x => x.IsDownloading, y => y.DownloadProgress.IsActive);
在这里,您会看到IsDownloading
将被路由到控件上的IsActive
项 - 因此任何更新都必须在UI线程上进行。所以这一切都有效。
但我不明白为什么ReactiveUI
是这样设计的。对于View而不是VM来说,更新发生在UI线程上似乎很重要,所以不应该绑定或OneWayBind
确保它在正确的线程上?实际上,如果你查看那些例程的XML文档,他们会讨论将事物附加到View的内容,所以暗示它应该总是在主线程上。
那么:为什么OneWayBind
和Bind没有暗中强迫MainThread
?我是否遗漏了ReactiveUI
如何工作(或可以工作)的内容?