我为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
进行选择?
答案 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));