2009-03-03 65 views
2

我有一个ViewModel类,我想响应内置的刷新命令,这是从按钮触发的,但我不知道如何声明CommandTarget。获取非UI对象来响应WPF命令绑定

简单地说,我的代码如下

视图模型构造和CanExecute和执行的事件处理程序 -

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'

我是新来的命令,所以这是完全可能的我在这里是各种各样的错误。任何帮助,将不胜感激。

回答

5

RoutedCommand s和MVVM不混合。 RoutedCommand s被绑定到可视化树上并依靠WPF的CommandBindings集合。您应该实现自己的ICommand类与MVVM模式一起工作。请参阅Prism's implementations初学者。

在我自己的MVVM的项目,我有一对夫妇的命令实现的:

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

谢谢肯特。这有助于 – Stimul8d 2009-03-03 12:07:58