这个概念是你将一个命令绑定到一个按钮,命令驱动这个按钮的两个属性:“点击时”和“启用”,从而产生你发布的界面。
您想要执行命令的主要原因是能够将按钮单击绑定到视图模型中的操作。
如果您创建一个将操作作为构造函数参数的自定义命令,您可以将视图模型中的方法直接连接到您的命令。
public class RelayCommand: ICommandd
{
Action action;
Func<bool> canExecute;
public RelayCommand(Action action) : this(action, () => true) {}
public RelayCommand(Action action, Func<bool> canExecute)
{
this.action = action;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return canExecute();
}
public void Execute(object parameter)
{
action();
}
}
在您的视图模型中的用法是
public RelayCommand SaveCommand { get; set; }
SaveCommand = new RelayCommand(OnSave);
public void Save()
{
// save logic...
}
如果你想连接 CanExecute,你也可以使用第二个 ctor 并提供一个 CanSave 方法。
public RelayCommand SaveCommand { get; set; }
SaveCommand = new RelayCommand(OnSave, CanSave);
public void Save()
{
// save logic...
}
public bool CanSave()
{
return // ...
}
您可能注意到我在实现中删除了命令参数。这在大多数情况下就足够了,并且可以在处理程序方法中为您节省额外的参数。对于剩下的 10%,我实现了一个 RelayCommand<T>,它采用 Action 而不是 Action,并将 Execute 方法更改为
public void Execute(object parameter)
{
action((T)parameter);
}
需要参数化处理程序
SaveCommand = new RelayCommand<SomeType>(OnSave);
public void Save(SomeType toSave)
{
// save logic using parameter
}
这可以避免您在使用 object 变量时遇到的所有转换问题,并确保您的视图模型类型安全。