12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- namespace InABox.Avalonia.Router;
- public class Router<TViewModelBase> where TViewModelBase:class
- {
- private TViewModelBase _currentViewModel = default!;
- protected readonly Func<Type, TViewModelBase> CreateViewModel;
-
-
- public event Action<TViewModelBase>? CurrentViewModelChanged;
- public Router(Func<Type, TViewModelBase> 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<T>(Action<T>? configure) where T : TViewModelBase
- {
- var viewModel = InstantiateViewModel<T>(configure);
- CurrentViewModel = viewModel;
- return viewModel;
- }
- protected T InstantiateViewModel<T>(Action<T>? configure) where T:TViewModelBase
- {
- var result = (T)Convert.ChangeType(CreateViewModel(typeof(T)), typeof(T));
- configure?.Invoke(result);
- return result;
- }
- }
|