namespace InABox.Avalonia.Router; public class Router where TViewModelBase:class { private TViewModelBase _currentViewModel = default!; protected readonly Func CreateViewModel; public event Action? CurrentViewModelChanged; public Router(Func createViewModel) { CreateViewModel = createViewModel; } protected TViewModelBase CurrentViewModel { set { if (value == _currentViewModel) return; _currentViewModel = value; OnCurrentViewModelChanged(value); } } private void OnCurrentViewModelChanged(TViewModelBase viewModel) { CurrentViewModelChanged?.Invoke(viewModel); } public virtual T GoTo(Action? configure) where T : TViewModelBase { var viewModel = InstantiateViewModel(configure); CurrentViewModel = viewModel; return viewModel; } protected T InstantiateViewModel(Action? configure) where T:TViewModelBase { var result = (T)Convert.ChangeType(CreateViewModel(typeof(T)), typeof(T)); configure?.Invoke(result); return result; } }