using System.Windows.Input; namespace CatalogLite; public sealed class AsyncCommand : ICommand { private readonly Func _execute; private readonly Func? _canExecute; private bool _isExecuting; public AsyncCommand(Func execute, Func? canExecute = null) { _execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute; } public event EventHandler? CanExecuteChanged; public bool CanExecute(object? parameter) => !_isExecuting && (_canExecute?.Invoke() ?? true); public async void Execute(object? parameter) { if (!CanExecute(parameter)) { return; } try { _isExecuting = true; RaiseCanExecuteChanged(); await _execute().ConfigureAwait(false); } finally { _isExecuting = false; RaiseCanExecuteChanged(); } } public void RaiseCanExecuteChanged() => CanExecuteChanged?.Invoke(this, EventArgs.Empty); }