WPF Customize DelegateCommand

本文深入探讨了DelCmd命令的实现细节,这是一个遵循ICommand接口的.NET类,用于定义可以执行的操作及其执行条件。文章详细解释了如何通过Action和Predicate委托来定制命令的执行逻辑和执行前的检查条件。

public class DelCmd : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

public DelCmd(Action<object> execute):this(execute,null)
{

}

public DelCmd(Action<object> execute,Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
if(_canExecute==null)
{
return true;
}
return _canExecute(parameter);
}

public void Execute(object parameter)
{
_execute(parameter);
}

}

转载于:https://www.cnblogs.com/Fred1987/p/10997181.html

WPF 中,`ICommand` 是实现命令模式的核心接口,主要用于将 UI 操作(如按钮点击)与实际执行的逻辑解耦。Prism 框架在 `ICommand` 的基础上提供了 `DelegateCommand`,它是一种更灵活、更易用的命令实现方式,特别适用于 MVVM 模式。 ### `ICommand` 接口的基本特性 `ICommand` 是 WPF 提供的用于命令处理的标准接口,其定义如下: ```csharp public interface ICommand { event EventHandler CanExecuteChanged; bool CanExecute(object parameter); void Execute(object parameter); } ``` - `CanExecute` 方法用于判断命令是否可以执行。 - `Execute` 方法定义了命令实际执行的逻辑。 - `CanExecuteChanged` 事件用于通知 UI 命令状态的变化,从而更新控件的启用状态。 该接口被 WPF 内建命令(如 `RoutedCommand`、`ApplicationCommands` 等)广泛实现[^1]。 ### `DelegateCommand` 的特点 Prism 框架中的 `DelegateCommand` 是对 `ICommand` 接口的一种具体实现,它通过委托的方式简化了命令的创建过程。它允许开发者直接将 `Execute` 和 `CanExecute` 逻辑作为委托传入构造函数中,从而避免了为每个命令创建单独类的繁琐操作。 ```csharp public class DelegateCommand : ICommand { private readonly Action<object> _execute; private readonly Predicate<object> _canExecute; public DelegateCommand(Action<object> execute, Predicate<object> canExecute = null) { _execute = execute ?? throw new ArgumentNullException(nameof(execute)); _canExecute = canExecute; } public bool CanExecute(object parameter) { return _canExecute == null || _canExecute(parameter); } public void Execute(object parameter) { _execute(parameter); } public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } public void RaiseCanExecuteChanged() { CommandManager.InvalidateRequerySuggested(); } } ``` ### 主要区别总结 | 特性 | `ICommand` | `DelegateCommand` | |------|-------------|-------------------| | 实现方式 | 接口,需手动实现所有方法 | Prism 提供的具体实现 | | 灵活性 | 需要自定义类实现接口 | 可直接通过委托构造 | | 适用场景 | 更适用于框架级命令(如全局命令) | 更适用于 MVVM 中的视图模型命令 | | 代码简洁性 | 需要较多样板代码 | 代码更简洁,易于维护 | | 支持参数 | 支持 `object` 类型参数 | 同样支持参数 | | 状态更新机制 | 需手动触发 `CanExecuteChanged` | 自动绑定 `CommandManager.RequerySuggested` | ### 使用示例 **使用 `ICommand` 实现命令:** ```csharp public class MyCommand : ICommand { public bool CanExecute(object parameter) { return true; } public void Execute(object parameter) { MessageBox.Show("Command executed!"); } public event EventHandler CanExecuteChanged { add { } remove { } } } ``` **使用 `DelegateCommand` 实现相同功能:** ```csharp ICommand myCommand = new DelegateCommand(ExecuteMyCommand, CanExecuteMyCommand); private bool CanExecuteMyCommand(object param) { return true; } private void ExecuteMyCommand(object param) { MessageBox.Show("Command executed!"); } ``` 可以看出,`DelegateCommand` 极大地简化了命令的创建过程,特别适合在 MVVM 架构中快速定义命令逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值