获取非UI对象以响应WPF命令绑定

时间:2009-03-03 11:58:57

标签: wpf command

我有一个ViewModel类,我想响应从按钮触发的内置刷新命令,但我不知道如何声明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'

我是命令的新手,所以我完全有可能在这里遇到各种错误。 Anyhelp将不胜感激。

1 个答案:

答案 0 :(得分:5)

RoutedCommand和MVVM不混合。 RoutedCommand与视觉树绑定并依赖于WPF的CommandBindings集合。您应该实现自己的ICommand类,这些类与MVVM模式一起使用。首先看一下Prism's implementations

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

  • DelegateCommand。调用提供了委托,以确定命令是否可以执行,以及执行命令。
  • ActiveAwareCommand。与接口(IActiveAware)一起使用,并将命令执行发送到当前活动的项目。多个主动感知实现使用该命令注册自己,该命令会自动将CanExecute / Execute个调用路由到当前活动的项目。