C# SelectMany之后仍然订阅可观察
我为WPF应用程序设置了标准的反应式ui路由,并且我有一个ViewModel可以实现的界面来提供标题信息C# SelectMany之后仍然订阅可观察,c#,wpf,system.reactive,reactiveui,C#,Wpf,System.reactive,Reactiveui,我为WPF应用程序设置了标准的反应式ui路由,并且我有一个ViewModel可以实现的界面来提供标题信息 public interface IHaveTitle { IObservable<string> Title { get; } } 其中disposer是传递到this.WhenActivated扩展方法的操作 现在,当我四处浏览时,标题确实会更改以反映URLPATHSEMENT,而在主视图模型上,标题会每5秒更新一次以显示时间 然而,我看到的问题是,即使我导航到不同
public interface IHaveTitle
{
IObservable<string> Title { get; }
}
其中disposer是传递到this.WhenActivated扩展方法的操作
现在,当我四处浏览时,标题确实会更改以反映URLPATHSEMENT,而在主视图模型上,标题会每5秒更新一次以显示时间
然而,我看到的问题是,即使我导航到不同的视图模型,主视图模型上可观察到的标题仍然会导致标题的更改
我真正的问题是:我如何防止这种情况?既然我是基于CurrentViewModel选择的,为什么当我离开时它不分离呢?问题在于使用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));
问题在于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));
我不知道开关是不是我一直在寻找的,我只是从来没有用过它!我不知道开关是不是我一直在寻找的,我只是从来没有用过它!
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));