[英]Observable still subscribed after SelectMany
我為WPF應用程序設置了標准反應式ui路由,並且具有ViewModel可以實現以提供標題信息的接口。
public interface IHaveTitle
{
IObservable<string> Title { get; }
}
在一個視圖模型中,我正在執行以下操作(出於演示目的):
public IObservable<string> Title => Observable.Interval(TimeSpan.FromSeconds(5)).Select(_ => DateTime.Now.ToLongTimeString());
在主窗口屏幕中,我正在執行以下操作:
disposer(
ViewModel.Router.CurrentViewModel
.SelectMany(vm =>
((vm as IHaveTitle)?.Title.StartWith("") ??
Observable.Return("")).Select(s => string.IsNullOrEmpty(s) ? vm.UrlPathSegment : $"{vm.UrlPathSegment} > {s}"))
.ObserveOn(RxApp.MainThreadScheduler)
.BindTo(this, w => w.Title));
其中disposer
是傳遞到this.WhenActivated
擴展方法中的Action<IDisposable>
。
現在,當我四處導航時,標題確實會更改以反映UrlPathSegment
,而在主視圖模型上,標題會更新以每5秒顯示一次時間。
但是,我看到的問題是,即使導航到其他視圖模型,在主視圖模型上可觀察到的標題仍會導致標題發生更改。
我的問題確實是:如何預防這種情況? 鑒於我基於CurrentViewModel
選擇,當我離開時為什么它不分離?
問題是使用SelectMany
。 您說的是“每當CurrentViewModel
更改時,都訂閱另一個可觀察的對象”。 由於這些可觀測對象永遠不會完成,因此它們將永遠保持“活動”狀態。
相反,您想切換到新的可觀察對象:
disposer(
ViewModel.Router.CurrentViewModel
.Select(vm =>
((vm as IHaveTitle)?.Title.StartWith("") ??
Observable.Return("")).Select(s => string.IsNullOrEmpty(s) ? vm.UrlPathSegment : $"{vm.UrlPathSegment} > {s}"))
.Switch()
.ObserveOn(RxApp.MainThreadScheduler)
.BindTo(this, w => w.Title));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.