2

我有一个 ViewModel 类,我想响应从按钮触发的内置 Refresh 命令,但我不确定如何声明 CommandTarget。

简而言之,我的代码如下

ViewModel 构造函数以及 CanExecute 和 Executed 事件处理程序 -

    public ViewModel()
    {
        CommandBinding binding = new CommandBinding(NavigationCommands.Refresh, CommandHandler);
        binding.CanExecute += new CanExecuteRoutedEventHandler(binding_CanExecute);
        binding.Executed += new ExecutedRoutedEventHandler(binding_Executed);
        CommandManager.RegisterClassCommandBinding(typeof(ViewModel), binding);
    }
    void binding_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        Debug.Print("Refreshing...");
    }

    void binding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
    {
        e.CanExecute = true;
    }

标记是 -

<Button Command="Refresh">refresh</Button>

现在,我尝试将此按钮上的 CommandTarget 设置为,{Binding Source={StaticResource ViewModel}}但我得到一个运行时说Cannot convert the value in attribute 'CommandTarget' to object of type 'System.Windows.IInputElement'.

我是命令新手,所以我完全有可能在这里错了。任何帮助,将不胜感激。

4

1 回答 1

5

RoutedCommands 和 MVVM 不能混用。RoutedCommands 绑定到可视化树并依赖于 WPF 的CommandBindings集合。您应该实现自己的ICommand与 MVVM 模式一起使用的类。看看Prism 的初学者实现。

在我自己的 MVVM 项目中,我有几个命令实现:

  • DelegateCommand. 调用提供的委托来确定命令是否可以执行,并执行命令。
  • ActiveAwareCommand. 与接口 ( IActiveAware) 结合使用,并将命令执行发送到当前活动的项目。多个活动感知实现向命令注册自己,命令自动路由CanExecute/Execute调用当前活动项。
于 2009-03-03T12:04:19.567 回答