ObMable仍在SelectMany

时间:2017-02-10 08:59:22

标签: c# wpf system.reactive reactiveui

我为WPF应用程序设置了标准的reactive-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传递给Action<IDisposable>扩展方法的this.WhenActivated。{/ p>

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

然而,我所看到的问题是,即使我导航到不同的视图模型,主视图模型上的标题可观察仍然会导致标题发生变化。

我的问题是:我该怎样阻止这个?在我离开的时候,为什么不分离,因为我根据CurrentViewModel进行选择?

1 个答案:

答案 0 :(得分: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));