using DMS.WPF.Interfaces; using DMS.WPF.ViewModels; using DMS.WPF.ViewModels.Items; using Microsoft.Extensions.DependencyInjection; namespace DMS.WPF.Services; /// /// INavigationService 的实现,负责解析ViewModel并处理参数传递。 /// public class NavigationService : INavigationService { private readonly IServiceProvider _serviceProvider; private readonly INotificationService _notificationService; /// /// 构造函数。 /// public NavigationService(IServiceProvider serviceProvider,INotificationService notificationService) { _serviceProvider = serviceProvider; _notificationService = notificationService; } /// /// 导航到指定键的视图,并传递参数。 /// public async Task NavigateToAsync(MenuItemViewModel menu) { if (string.IsNullOrEmpty(menu.TargetViewKey)) { return; } var mainViewModel = App.Current.Services.GetRequiredService(); var viewModel = GetViewModelByKey(menu.TargetViewKey); if (viewModel == null) { _notificationService.ShowError($"切换界面失败,没有找到界面:{menu.TargetViewKey}"); return; } if (viewModel is INavigatable navigatableViewModel) { await navigatableViewModel.OnNavigatedToAsync(menu); } mainViewModel.CurrentViewModel = viewModel; } /// /// 导航到指定键的视图,并传递参数。 /// public async Task NavigateToAsync(string viewKey, object parameter = null) { var mainViewModel = App.Current.Services.GetRequiredService(); var viewModel = GetViewModelByKey(viewKey); if (viewModel == null) { _notificationService.ShowError($"切换界面失败,没有找到界面:{viewKey}"); return; } mainViewModel.CurrentViewModel = viewModel; } private ViewModelBase GetViewModelByKey(string key) { try { switch (key) { case "HomeView": return App.Current.Services.GetRequiredService(); case "DevicesView": return App.Current.Services.GetRequiredService(); case "DeviceDetailView": return App.Current.Services.GetRequiredService(); case "DataTransformView": return App.Current.Services.GetRequiredService(); case "VariableTableView": return App.Current.Services.GetRequiredService(); case "VariableHistoryView": return App.Current.Services.GetRequiredService(); case "LogHistoryView": return App.Current.Services.GetRequiredService(); case "MqttsView": return App.Current.Services.GetRequiredService(); case "MqttServerDetailView": return App.Current.Services.GetRequiredService(); case "SettingView": return App.Current.Services.GetRequiredService(); case "EmailManagementView": return App.Current.Services.GetRequiredService(); default: return null; } } catch (Exception e) { _notificationService.ShowError($"切换界面失败,获取:{key}对应的ViewModel时发生了错误:{e.Message}"); throw; } } }