/
Yaroslav4444-bauer
/
ArmyFight
Обзор
Документация
Войти
/
Yaroslav4444-bauer
/
ArmyFight
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
ViewModels/RelayCommand.cs
81 строка
3 KB
Yaroslav4444-bauer
Добовлены комментарии summary
01 июн 2026, 12:38
01 июн 2026, 12:38
70196b7
Код
Авторство
О чём код?
using System.Windows.Input; using WpfCommand = System.Windows.Input.ICommand; namespace ArmyFight.ViewModels { /// <summary> /// Синхронная команда WPF с опциональной проверкой CanExecute. /// </summary> public class RelayCommand : WpfCommand { private readonly Action _execute; private readonly Func<bool>? _canExecute; /// <summary> /// Создаёт команду с делегатом выполнения и необязательным условием доступности. /// </summary> /// <param name="execute">Действие при выполнении.</param> /// <param name="canExecute">Условие доступности команды.</param> public RelayCommand(Action execute, Func<bool>? canExecute = null) { _execute = execute; _canExecute = canExecute; } public event EventHandler? CanExecuteChanged { add => CommandManager.RequerySuggested += value; remove => CommandManager.RequerySuggested -= value; } /// <inheritdoc /> public bool CanExecute(object? parameter) => _canExecute?.Invoke() ?? true; /// <inheritdoc /> public void Execute(object? parameter) => _execute(); } /// <summary> /// Асинхронная команда WPF: блокирует повторный запуск до завершения Task. /// </summary> public class AsyncRelayCommand : WpfCommand { private readonly Func<Task> _execute; private readonly Func<bool>? _canExecute; private bool _running; /// <summary> /// Создаёт асинхронную команду. /// </summary> /// <param name="execute">Асинхронное действие.</param> /// <param name="canExecute">Условие доступности.</param> public AsyncRelayCommand(Func<Task> execute, Func<bool>? canExecute = null) { _execute = execute; _canExecute = canExecute; } public event EventHandler? CanExecuteChanged { add => CommandManager.RequerySuggested += value; remove => CommandManager.RequerySuggested -= value; } /// <inheritdoc /> public bool CanExecute(object? parameter) => !_running && (_canExecute?.Invoke() ?? true); /// <inheritdoc /> public async void Execute(object? parameter) { if (!CanExecute(parameter)) return; _running = true; CommandManager.InvalidateRequerySuggested(); try { await _execute(); } finally { _running = false; CommandManager.InvalidateRequerySuggested(); } } } }