这个概念是将一个命令绑定到一个按钮上,该命令驱动该按钮的两个属性:"单击"和"启用",从而得到您发布的界面。
你想使用命令的主要原因是能够将按钮点击绑定到视图模型中的操作。
如果你创建一个自定义命令,将一个操作作为构造函数参数,那么你可以直接将视图模型中的方法连接到你的命令上。
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()
{
}
如果您想同时连接CanExecute,您可以使用第二个构造函数并提供一个CanSave方法。
public RelayCommand SaveCommand { get; set; }
SaveCommand = new RelayCommand(OnSave, CanSave);
public void Save()
{
}
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)
{
}
这将避免您在使用
object
变量时遇到的所有类型转换问题,并使您的视图模型保持类型安全。