【问题标题】:Rig up a Command装配一个命令
【发布时间】:2014-10-18 06:39:00
【问题描述】:

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

<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?我是否只是在 ViewModel 中有一个名为 ActionCommand 的实例,这似乎不起作用,或者我必须做什么?

【问题讨论】:

  • 您的视图模型将有一个 ICommand 类型的公共属性(可能命名为 ActionCommand),您可以绑定到该属性。

标签: c# wpf mvvm command


【解决方案1】:

这是一个相同的示例

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

【讨论】:

  • 但这只是给视图模型一个ICommand 属性?如何让命令执行?
  • 通常此命令绑定到按钮、菜单等,在单击绑定按钮时执行。如果您看到该按钮未启用,那么您可能需要连接CanExecuteChanged。请参阅Allowing CommandManager to query your ICommand objects了解更多信息
  • 我的意思是,ActionCommand被触发时执行的代码在哪里?
  • 触发ActionCommand时,Execute(object)方法从ICommand的实现中被调用。根据您的实现,它最终会调用_viewModel.ProcessAction((Action)parameter);
  • 您的代码中没有 ICommand 的实现,只有一个 ICommand 属性。是什么告诉该属性执行Action
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
相关资源
最近更新 更多