namespace Artemis.UI.Shared.Routing; /// /// Represents a view model to which routing can take place and which in turn can host another view model. /// /// The type of view model the screen can host. public abstract class RoutableHostScreen : RoutableScreen, IRoutableHostScreen where TScreen : RoutableScreen { private bool _recycleScreen = true; private TScreen? _screen; /// /// Gets the currently active child screen. /// public TScreen? Screen { get => _screen; private set => RaiseAndSetIfChanged(ref _screen, value); } /// public bool RecycleScreen { get => _recycleScreen; protected set => RaiseAndSetIfChanged(ref _recycleScreen, value); } IRoutableScreen? IRoutableHostScreen.InternalScreen => Screen; void IRoutableHostScreen.InternalChangeScreen(IRoutableScreen? screen) { if (screen == null) { Screen = null; return; } if (screen is not TScreen typedScreen) throw new ArtemisRoutingException($"Screen cannot be hosted, {screen.GetType().Name} is not assignable to {typeof(TScreen).Name}."); Screen = typedScreen; } }