Форум программистов, компьютерный форум, киберфорум
Andrey-MSK
Войти
Регистрация
Восстановить пароль

WPF - Выполнение команды при закрытии окна

Запись от Andrey-MSK размещена 27.03.2023 в 16:10
Показов 1702 Комментарии 2
Метки .net, c#, wpf

1. Ставим из NuGet - Microsoft.Xaml.Behaviors.Wpf.
2. В VM пишем нужную команду, у меня, например, открыть окно
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
private RelayCommand _closedCommand;
 
private void ClosedExecute(object obj)
{
    try
    {
        var vm = _viewModelFactory.CreateViewModel<IMDrawSummaryDialogVM>();
 
        vm.CurrentEObject = new EObject
        {
            EObjectID = EObject.EObjectID,
            EObjectName = EObject.EObjectName
        };
 
        _windowService.ShowDialog(vm);
    }
    catch (Exception ex)
    {
        _windowService.ShowErrorMessage(ex.ToString(), "Ошибка");
    }
}
 
public RelayCommand ClosedCommand => _closedCommand ??
    (_closedCommand = new RelayCommand(ClosedExecute));
3. Привязываем команду в XAML окна
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<Window 
    ...
    xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
    ...>
 
    <!-- Перед Grid окна -->
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Closed">
            <i:InvokeCommandAction Command="{Binding ClosedCommand, Mode=OneTime}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
 
    <Grid>
 
    </Grid>
</Window>
Метки .net, c#, wpf
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Элд Хасп
    На мой взгляд, неудачный пример.
    1) С точки зрения VM, сервис _windowService - это сервис диалогов. Будет ли при этом показано окно или сообщение "улетит на Луну" для VM должно быт безразлично.
    Логику этого сервиса не знаю. Возможно, неверно только название этого сервиса.

    2) Было бы полезным добавить обработку ответа от VM - отмену закрытия. Типа: при закрытии проверяются данные, если они изменились запрашивается "Сохранить-Не сохранять-Отменить". И на отменить нужно вернуться обратно в Окно.
    Запись от Элд Хасп размещена 23.06.2023 в 14:13 Элд Хасп на форуме
  2. Старый комментарий
    Аватар для Andrey-MSK
    1. Сервис вот такой, он просто показывает разные типы окон
    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;
                }
            }
        }
    }
    2. Эта обработка производится в методе Save() вызываемого диалога.
    Запись от Andrey-MSK размещена 23.06.2023 в 14:19 Andrey-MSK вне форума
 
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru