ObMable仍在SelectMany之后订阅

Cli*_*int 0 c# wpf system.reactive reactiveui

我为WPF应用程序设置了标准的reactive-ui路由,我有一个ViewModel可以实现的接口来提供标题信息.

public interface IHaveTitle
{
    IObservable<string> Title { get; }
}
Run Code Online (Sandbox Code Playgroud)

在一个视图模型中,我正在执行以下操作(用于演示目的):

public IObservable<string> Title => Observable.Interval(TimeSpan.FromSeconds(5)).Select(_ => DateTime.Now.ToLongTimeString());
Run Code Online (Sandbox Code Playgroud)

在我的主窗口屏幕中,我正在执行以下操作:

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));
Run Code Online (Sandbox Code Playgroud)

disposerAction<IDisposable>传递到this.WhenActivated扩展方法.

现在,当我浏览时,标题确实会改变以反映UrlPathSegment,而在主视图模型上,标题会更新以显示每5秒的时间.

然而,我所看到的问题是,即使我导航到不同的视图模型,主视图模型上的标题可观察仍然会导致标题上的更改.

我的问题是:我如何防止这种情况发生?为什么在我离开时它不会分离,因为我选择的是基于CurrentViewModel

Ken*_*art 5

问题是使用SelectMany.你说"每次CurrentViewModel改变,都订阅这个其他可观察的".由于这些可观测量从未完成,它们将永远"活跃".

您想要切换到新的observable:

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));
Run Code Online (Sandbox Code Playgroud)