using DMS.Core.Models;
using DMS.WPF.Interfaces;
using DMS.WPF.ViewModels;
using DMS.WPF.ItemViewModel;
using DMS.WPF.Views;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
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(object sender,NavigationParameter parameter)
{
if (parameter == null || string.IsNullOrWhiteSpace(parameter.TargetViewKey) )return;
var viewModel = GetViewModelByKey(parameter.TargetViewKey);
if (viewModel == null)
{
_notificationService.ShowError($"切换界面失败,没有找到界面:{parameter.TargetViewKey}");
return;
}
if (sender is INavigatable fromViewModel)
{
await fromViewModel.OnNavigatedFromAsync(parameter);
}
var mainViewModel = App.Current.Services.GetRequiredService();
mainViewModel.CurrentViewModel = viewModel;
if (viewModel is INavigatable toViewModel)
{
await toViewModel.OnNavigatedToAsync(parameter);
}
}
private ViewModelBase GetViewModelByKey(string key)
{
try
{
switch (key)
{
case nameof(HomeViewModel):
return App.Current.Services.GetRequiredService();
case nameof(DevicesViewModel):
return App.Current.Services.GetRequiredService();
case nameof(DeviceDetailViewModel):
return App.Current.Services.GetRequiredService();
case nameof(DataTransformViewModel):
return App.Current.Services.GetRequiredService();
case nameof(VariableTableViewModel):
return App.Current.Services.GetRequiredService();
case nameof(VariableHistoryViewModel):
return App.Current.Services.GetRequiredService();
case nameof(LogHistoryViewModel):
return App.Current.Services.GetRequiredService();
case nameof(MqttsViewModel):
return App.Current.Services.GetRequiredService();
case nameof(MqttServerDetailViewModel):
return App.Current.Services.GetRequiredService();
case nameof(SettingViewModel):
return App.Current.Services.GetRequiredService();
case nameof(EmailManagementViewModel):
return App.Current.Services.GetRequiredService();
case nameof(TriggersViewModel):
return App.Current.Services.GetRequiredService();
default:
return null;
}
}
catch (Exception e)
{
_notificationService.ShowError($"切换界面失败,获取:{key}对应的ViewModel时发生了错误:{e.Message}");
throw;
}
}
}