Router.cs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. public T InstantiateViewModel<T>(Action<T>? configure) where T : TViewModelBase
  31. {
  32. var result = (T)Convert.ChangeType(CreateViewModel(typeof(T)), typeof(T));
  33. if (result is IDualFunctionViewModel dualFunction)
  34. {
  35. dualFunction.IsPopup = false;
  36. }
  37. configure?.Invoke(result);
  38. return result;
  39. }
  40. }