2017-02-10 6 views
0

WPF 앱에 대해 표준 reactive-ui 라우팅을 설정했으며 ViewModel에서 제목 정보를 제공하기 위해 구현할 수있는 인터페이스가 있습니다.Observable 여전히 SelectMany 후 구독

public interface IHaveTitle 
{ 
    IObservable<string> Title { get; } 
} 

하나 개의 뷰 모델에서 나는 다음 (데모 목적)하고 있어요 :

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

: 내 메인 윈도우 화면에서

public IObservable<string> Title => Observable.Interval(TimeSpan.FromSeconds(5)).Select(_ => DateTime.Now.ToLongTimeString()); 

을, 나는 다음과 같은 일을 해요 여기서 disposerAction<IDisposable>이고, 확장 방법은 this.WhenActivated입니다.

이제 탐색 할 때 UrlPathSegment을 반영하여 제목이 변경되고 기본보기 모델에서 제목이 5 초마다 표시되도록 업데이트됩니다.

그러나 내가보고있는 문제는 다른보기 모델로 이동해도 기본보기 모델에서 관찰 할 수있는 제목이 여전히 제목의 변경을 초래한다는 것입니다.

내 질문은 정말로 : 어떻게 방지합니까? CurrentViewModel을 기반으로 선택하면 내가 멀리 이동할 때 왜 분리되지 않습니까?

답변

5

문제는 SelectMany입니다. "CurrentViewModel가 변경 될 때마다이 다른 관찰 가능 항목을 구독하십시오"라고 말하는 것입니다. 그러한 관찰은 결코 끝나지 않으므로 영원히 "활동적"입니다.

는 대신 새로운 관측에 스위치 원하는 :

Switch` 내가 찾던했다`궁금했던
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)); 
+0

가, 난 그냥 전에 그것을 사용하지 않을 것입니다! – Clint