public DismissableOnboardingStep(IOnboardingStep onboardingStep, string key, IOnboardingStorage onboardingStorage) { Ensure.Argument.IsNotNull(onboardingStep, nameof(onboardingStep)); Ensure.Argument.IsNotNullOrWhiteSpaceString(key, nameof(key)); Ensure.Argument.IsNotNull(onboardingStorage, nameof(onboardingStorage)); this.onboardingStorage = onboardingStorage; Key = key; wasDismissedSubject = new BehaviorSubject <bool>( onboardingStorage.WasDismissed(this) ); ShouldBeVisible = onboardingStep .ShouldBeVisible .CombineLatest( wasDismissedSubject.AsObservable(), (shouldBeVisible, wasDismissed) => shouldBeVisible && !wasDismissed); }