WPF - Выполнение команды при закрытии окна
Запись от Andrey-MSK размещена 27.03.2023 в 16:10
Показов 1702
Комментарии 2
|
1. Ставим из NuGet - Microsoft.Xaml.Behaviors.Wpf. 2. В VM пишем нужную команду, у меня, например, открыть окно
| ||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
-
На мой взгляд, неудачный пример.
1) С точки зрения VM, сервис_windowService- это сервис диалогов. Будет ли при этом показано окно или сообщение "улетит на Луну" для VM должно быт безразлично.
Логику этого сервиса не знаю. Возможно, неверно только название этого сервиса.
2) Было бы полезным добавить обработку ответа от VM - отмену закрытия. Типа: при закрытии проверяются данные, если они изменились запрашивается "Сохранить-Не сохранять-Отменить". И на отменить нужно вернуться обратно в Окно.Запись от Элд Хасп размещена 23.06.2023 в 14:13
-
1. Сервис вот такой, он просто показывает разные типы окон
2. Эта обработка производится в методе Save() вызываемого диалога.C# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
using System; using System.IO; using System.Linq; using System.Windows; using DBClient.Services.Interfaces; using Microsoft.Win32; using Services.Interfaces; using VModels.WindowsVM; namespace DBClient.Services { internal class WindowService : IWindowService { private readonly IViewModelsService _viewModelsService; public WindowService(IViewModelsService viewModelsService) { _viewModelsService = viewModelsService; } public Window GetWindow(IBaseViewModel viewModel) { var window = _viewModelsService.GetWindow(viewModel); window.DataContext = viewModel; return window; } public string ShowOpenFileDialog(string fileName, string defaultExt, string filter) { var openFileDialog = new OpenFileDialog() { InitialDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "00 - DB Client"), FileName = fileName, DefaultExt = defaultExt, Filter = filter, RestoreDirectory = true }; return openFileDialog.ShowDialog() == true ? openFileDialog.FileName : null; } public void ShowWindow(IBaseViewModel viewModel) { WindowCollection windows = Application.Current.Windows; Window window = windows .OfType<Window>() .FirstOrDefault(w => w.DataContext?.GetType() == viewModel.GetType()); // Тут кусок именно для моего приложения, проверка типа открытого окна // Нужно для избежания кое-каких ошибок в логике записи данных if (viewModel.GetType() == typeof(DrawDetailsReportWindowVM)) { GetWindow(viewModel).Show(); } else { if (window == null) { GetWindow(viewModel).Show(); } else { window.Activate(); } } } public void CloseWindow(IBaseViewModel viewModel) => GetWindow(viewModel).Close(); public bool? ShowDialog(IBaseViewModel viewModel) => GetWindow(viewModel).ShowDialog(); public void ShowErrorMessage(string message, string caption) => MessageBox.Show(message, caption, MessageBoxButton.OK, MessageBoxImage.Error); public void ShowInfoMessage(string message, string caption) => MessageBox.Show(message, caption, MessageBoxButton.OK, MessageBoxImage.Information); public bool ShowQuestionMessage(string message, string caption) { if (MessageBox.Show(message, caption, MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes) { return true; } else { return false; } } public bool ShowWarningMessage(string message, string caption) { if (MessageBox.Show(message, caption, MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) { return true; } else { return false; } } } }
Запись от Andrey-MSK размещена 23.06.2023 в 14:19


