我有一个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将不胜感激。
答案 0 :(得分:5)
RoutedCommand
和MVVM不混合。 RoutedCommand
与视觉树绑定并依赖于WPF的CommandBindings
集合。您应该实现自己的ICommand
类,这些类与MVVM模式一起使用。首先看一下Prism's implementations。
在我自己的MVVM项目中,我有几个命令实现:
DelegateCommand
。调用提供了委托,以确定命令是否可以执行,以及执行命令。ActiveAwareCommand
。与接口(IActiveAware
)一起使用,并将命令执行发送到当前活动的项目。多个主动感知实现使用该命令注册自己,该命令会自动将CanExecute
/ Execute
个调用路由到当前活动的项目。