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; } public T InstantiateViewModel(Action? configure) where T : TViewModelBase { var result = (T)Convert.ChangeType(CreateViewModel(typeof(T)), typeof(T)); if (result is IDualFunctionViewModel dualFunction) { dualFunction.IsPopup = false; } configure?.Invoke(result); return result; } }