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();
case "TriggersView":
return App.Current.Services.GetRequiredService();
default:
return null;
}
}
catch (Exception e)
{
_notificationService.ShowError($"切换界面失败,获取:{key}对应的ViewModel时发生了错误:{e.Message}");
throw;
}
}
}