Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SelectMany之后仍然订阅可观察_C#_Wpf_System.reactive_Reactiveui - Fatal编程技术网

C# SelectMany之后仍然订阅可观察

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秒更新一次以显示时间 然而,我看到的问题是,即使我导航到不同

我为WPF应用程序设置了标准的反应式ui路由,并且我有一个ViewModel可以实现的界面来提供标题信息

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));