Router.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. namespace InABox.Avalonia.Router;
  2. public class Router<TViewModelBase> where TViewModelBase:class
  3. {
  4. private TViewModelBase _currentViewModel = default!;
  5. protected readonly Func<Type, TViewModelBase> CreateViewModel;
  6. public event Action<TViewModelBase>? CurrentViewModelChanged;
  7. public Router(Func<Type, TViewModelBase> createViewModel)
  8. {
  9. CreateViewModel = createViewModel;
  10. }
  11. protected TViewModelBase CurrentViewModel
  12. {
  13. set
  14. {
  15. if (value == _currentViewModel) return;
  16. _currentViewModel = value;
  17. OnCurrentViewModelChanged(value);
  18. }
  19. }
  20. private void OnCurrentViewModelChanged(TViewModelBase viewModel)
  21. {
  22. CurrentViewModelChanged?.Invoke(viewModel);
  23. }
  24. public virtual T GoTo<T>(Action<T>? configure) where T : TViewModelBase
  25. {
  26. var viewModel = InstantiateViewModel<T>(configure);
  27. CurrentViewModel = viewModel;
  28. return viewModel;
  29. }
  30. protected T InstantiateViewModel<T>(Action<T>? configure) where T:TViewModelBase
  31. {
  32. var result = (T)Convert.ChangeType(CreateViewModel(typeof(T)), typeof(T));
  33. configure?.Invoke(result);
  34. return result;
  35. }
  36. }