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)
凡disposer在Action<IDisposable>传递到this.WhenActivated扩展方法.
现在,当我浏览时,标题确实会改变以反映UrlPathSegment,而在主视图模型上,标题会更新以显示每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));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |