public class RelayCommand<T> : ICommand { private Action<T> _action; public RelayCommand(Action<T> action) { _action = action; } public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) => true; public void Execute(object parameter) => _action?.Invoke((T)parameter); } 详细解释下
时间: 2023-05-25 17:01:30 浏览: 85
这是一个泛型命令类 `RelayCommand<T>`,它实现了 `ICommand` 接口,该接口用于表示一条命令,并且能够检查该命令是否可执行以及执行该命令。
接下来是该类的详细解释:
- 构造函数 `RelayCommand(Action<T> action)`: 构造函数接受一个 `Action<T>` 委托参数,该委托表示该命令执行时所要执行的动作。
- 私有字段 `_action`: 该字段用于存储传入构造函数的 `Action<T>` 委托参数。
- 事件 `CanExecuteChanged`: 这是命令可执行状态改变时所触发的事件,当该事件被触发时,WPF 界面可以重新检查该命令是否可执行,并做出相应的响应。
- 方法 `CanExecute(object parameter)`: 这是一个被动态调用并返回一个布尔值的方法。当该命令可以执行时,该方法返回 `true`,否则返回 `false`。在该类中,返回值一直是 `true`,所以该命令一直可用。
- 方法 `Execute(object parameter)`: 这是执行命令所需的方法。其参数 `parameter` 表示传递给命令的参数。在该类中,它调用存储在私有字段 `_action` 中的委托,并将传递的参数转换为泛型类型 `T`,最后执行该委托。
这个泛型命令类可以用于各种情况,提供了一种方便、简单的方式来执行单一操作,在 MVVM(Model-View-ViewModel)应用中经常使用。
相关问题
public class RelayCommand : ICommand { private Action _action; public RelayCommand(Action action) { _action = action; } public event EventHandler CanExecuteChanged; public bool CanExecute(object parameter) => true; public void Execute(object parameter) => _action?.Invoke(); 其中 _action?.Invoke(); 什么意思 }
_action?.Invoke()表示如果_action不为null,则调用_action引用的方法。它是C# 6.0及更高版本的新语法,称为null-conditional operator,可以更简洁地处理null引用异常。如果_action为null,则不会引发异常,方法调用将被忽略。
如何自己实现RelayCommand类
以下是一个简单的RelayCommand实现,您可以在WPF MVVM模式中使用它来绑定按钮事件:
```csharp
public class RelayCommand : ICommand
{
private readonly Action _execute;
private readonly Func<bool> _canExecute;
public RelayCommand(Action execute, Func<bool> canExecute = null)
{
_execute = execute ?? throw new ArgumentNullException(nameof(execute));
_canExecute = canExecute;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter) => _canExecute?.Invoke() ?? true;
public void Execute(object parameter) => _execute();
public void RaiseCanExecuteChanged() => CommandManager.InvalidateRequerySuggested();
}
```
在上面的代码中,RelayCommand类实现了ICommand接口,包括CanExecuteChanged、CanExecute和Execute方法。其中CanExecuteChanged用于通知UI更新按钮状态,CanExecute返回一个bool值,用于判断按钮是否可用,Execute用于执行按钮的操作。
使用RelayCommand时,需要在ViewModel中声明一个RelayCommand类型的属性,并在构造函数中实例化该属性,例如:
```csharp
public class MainViewModel : ViewModelBase
{
public RelayCommand SelectImageCommand { get; set; }
public MainViewModel()
{
SelectImageCommand = new RelayCommand(SelectImage);
}
private void SelectImage()
{
// 添加选择图像的代码
}
}
```
然后在XAML中绑定该属性,例如:
```xml
<Button Content="选择图像" Command="{Binding SelectImageCommand}" />
```
通过以上步骤,您可以在WPF MVVM模式中使用自己实现的RelayCommand来绑定按钮事件。