掌握一个命令

时间:2014-10-18 06:39:01

标签: c# wpf mvvm command

我在按钮上设置了一个命令参数,如下所示:

<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中有一个实例,它似乎不起作用,或者我该怎么办?

1 个答案:

答案 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; }
}