Files
ShrlAlgoToolkit/Melskin/Utilities/RelayCommand.cs
2026-02-24 11:34:18 +08:00

51 lines
1.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.Windows.Input;
namespace Melskin.Utilities;
/// <summary>
/// 一个简单的ICommand实现用于传递动作。
/// </summary>
internal class RelayCommand : ICommand
{
private readonly Action<object?> execute;
private readonly Predicate<object?>? canExecute;
/// <summary>
/// 当命令的可执行状态更改时发生的事件。 广播此事件通知UI当命令的CanExecute方法返回值发生变化时需要重新查询命令的状态。
/// </summary>
public event EventHandler? CanExecuteChanged;
/// <summary>
/// 初始化 RelayCommand 的新实例。
/// </summary>
/// <param name="execute">命令执行的逻辑。</param>
/// <param name="canExecute">判断命令是否可以执行的逻辑(可选)。如果为 null则命令始终可执行。</param>
/// <exception cref="ArgumentNullException">execute 为 null 时抛出。</exception>
public RelayCommand(Action<object?> execute, Predicate<object?>? canExecute = null)
{
this.execute = execute ?? throw new ArgumentNullException(nameof(execute));
this.canExecute = canExecute;
}
/// <summary>
/// 判断命令是否可以执行。
/// </summary>
/// <param name="parameter">传递给命令的参数。</param>
/// <returns>返回一个布尔值指示命令是否能够执行。对于此实现总是返回true。</returns>
public bool CanExecute(object? parameter) => canExecute == null || canExecute(parameter);
/// <summary>
/// 执行命令。
/// </summary>
/// <param name="parameter">传递给命令的参数。</param>
public void Execute(object? parameter) => execute(parameter);
/// <summary>
/// 手动通知 UI 刷新此按钮的状态。
/// </summary>
public void RaiseCanExecuteChanged()
{
// 触发事件,通知订阅了此命令的 UI 控件
CanExecuteChanged?.Invoke(this, EventArgs.Empty);
}
}