using System; using System.Collections.Generic; using System.Windows; using XLIMS.CONTRACT; using XLIMS.PSV.ViewModels; using XLIMS.PSV.Windows; namespace XLIMS.SERVICES; public class DialogService : IDialogService { // Словарь: ViewModel → соответствующий Window private readonly Dictionary _mappings = new(); public DialogService() { // Регистрируем соответствия (можно вынести в отдельный конфигуратор) Register(); Register(); Register(); Register(); Register(); // и т.д. } public void Register() where TViewModel : class where TWindow : Window, new() { _mappings[typeof(TViewModel)] = typeof(TWindow); } public void ShowDialog(TViewModel viewModel) where TViewModel : class { ShowDialogInternal(viewModel, true); } public bool? ShowDialog(TViewModel viewModel, out object? result) where TViewModel : class { var dialogResult = ShowDialogInternal(viewModel, true); result = (dialogResult.Owner as Window)?.DialogResult; return dialogResult.DialogResult; } // Немодальное окно (опционально) public void Show(TViewModel viewModel) where TViewModel : class { ShowDialogInternal(viewModel, false); } private Window ShowDialogInternal(object viewModel, bool modal) { var vmType = viewModel.GetType(); if (!_mappings.TryGetValue(vmType, out var windowType)) throw new InvalidOperationException($"Нет зарегистрированного окна для ViewModel {vmType}"); var window = (Window)Activator.CreateInstance(windowType)!; window.DataContext = viewModel; // Если главное окно уже открыто — устанавливаем Owner (чтобы окно не уходило за него) if (Application.Current?.MainWindow != null && Application.Current.MainWindow != window) window.Owner = Application.Current.MainWindow; if (modal) window.ShowDialog(); else window.Show(); return window; } }