using System.Linq; using System; using System.Reactive; using System.Reactive.Linq; using detect.gui.Api; using detect.gui.Commons; using detect.gui.Models; using ReactiveUI; namespace detect.gui.ViewModels; public class MainViewModel : ViewModelBase, IScreen { private RoutingState _router; public RoutingState Router { get => _router; set => this.RaiseAndSetIfChanged(ref _router, value); } /// /// 当前登录用户 /// private UserModel? _currentUser; public UserModel? CurrentUser { get => _currentUser; set => this.RaiseAndSetIfChanged(ref _currentUser, value); } public bool IsHomeView { get; set; } public bool IsDetectTaskView { get; set; } public bool IsDeviceView { get; set; } public bool IsLogView { get; set; } public bool IsUserView { get; set; } public MainViewModel() { ApiService.Instance.StartService(); _router = new RoutingState(); GotoCommand = ReactiveCommand.Create((p) => Goto(p)); LogoutCommand = ReactiveCommand.Create(Logout); Router.CurrentViewModel.Select(x => x) .Subscribe(v => { IsHomeView = v is HomeViewModel; IsDetectTaskView = v is DetectTaskViewModel; IsDeviceView = v is DeviceViewModel; IsLogView = v is LogViewModel; IsUserView = v is UserViewModel; this.RaisePropertyChanged(nameof(IsHomeView)); this.RaisePropertyChanged(nameof(IsDetectTaskView)); this.RaisePropertyChanged(nameof(IsDeviceView)); this.RaisePropertyChanged(nameof(IsLogView)); this.RaisePropertyChanged(nameof(IsUserView)); }); RouterHelper.Init(Router); } public void Dispose() { ApiService.Instance.StopService(); } #region 路由 public ReactiveCommand GotoCommand { get; } public void Goto(string viewModelTypeName, object? param = null) { var name = Router.CurrentViewModel.ToEnumerable().FirstOrDefault()!.GetType().Name; if (name == viewModelTypeName) return; var viewModelType = viewModelTypeName.GetTypeByName(); if (viewModelType == null) return; var viewModelItem = RouterHelper.FindViewModelItem(RouterHelper.ViewModelList, viewModelTypeName, null); viewModelItem?.Goto(param); } public void GoBack() { var v = Router.CurrentViewModel.ToEnumerable().FirstOrDefault(); var viewModelItem = RouterHelper.FindViewModelItem(RouterHelper.ViewModelList, v!.GetType().Name, null); viewModelItem?.Goback(); } #endregion #region 注销 public ReactiveCommand LogoutCommand { get; } private void Logout() { CurrentUser = null; Router.NavigationStack.Clear(); Router.Navigate.Execute(new LoginViewModel()); } #endregion }