我在按钮上设置了一个命令参数,如下所示:
<hw:ActionButton Content="MC" Command="{Binding ActionCommand}" CommandParameter="{x:Static hw:Action.MemoryClear}" Grid.Row="2" Grid.Column="0" />
该命令在课堂上:
public class ActionCommand : ICommand
{
private readonly CalculatorViewModel _viewModel;
public ActionCommand(CalculatorViewModel viewModel)
{
_viewModel = viewModel;
}
public bool CanExecute(object parameter)
{
return _viewModel != null && parameter is Action;
}
public void Execute(object parameter)
{
_viewModel.ProcessAction((Action)parameter);
}
public event EventHandler CanExecuteChanged;
}
现在我知道命令必须在ViewModel中,那么如何将此命令耦合到ViewModel?我只是在名为ActionCommand
的ViewModel中有一个实例,它似乎不起作用,或者我该怎么办?
答案 0 :(得分:0)
这是同一个
的样本class CalculatorViewModel
{
public CalculatorViewModel()
{
ActionCommand = new ActionCommand(this);
...
}
public ActionCommand ActionCommand { get; private set; }
...
}
上面的是一个简单的示例,演示了命令的属性,可以绑定到UI中的按钮
这里要注意的是,绑定仅适用于公共属性,公共变量不能以相同的方式工作。
作为建议,如果要创建更多类似的命令,可以使用一些DelegateCommand。
什么是CanExecuteChanged?
来自Allowing CommandManager to query your ICommand objects
因为默认情况下WPF不知道您的自定义ICommand对象存在。怎么会这样?
幸运的是,这个问题很容易解决。在 ICommand 实施中,您将 CanExecuteChanged 事件挂钩 CommandManager的RequerySuggested 事件。
样品
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}