我在XAML中定义了一些命令绑定:
<UserControl.CommandBindings>
<CommandBinding
Command="commands:Commands.GrantAccessCommand"
Executed="HelpExecuted" />
</UserControl.CommandBindings>
所以GrantAccessCommand位于一个名为Commands的单独类中,HelpExecuted位于我的代码后面。它工作正常。现在当我将HelpExecuted放在另一个类中时,我得到一个错误“... HelpExecuted'不是一个有效的事件处理程序方法名。只有生成的或代码隐藏类的实例方法才有效。”代码:
Executed="commands:Commands.HelpExecuted"
//I also tryed: Executed="x:Static commands:Commands.HelpExecuted"
我知道我可以在代码后面使用CommandBindings.Add(new CommandBinding(GrantAccessCommand,HelpExecuted));但我想使用XAML
来做到这一点有办法吗?
答案 0 :(得分:1)
我猜是.Net 3.5。从http://www.codeproject.com/KB/WPF/CentralizingWPFCommands.aspx:当前的WPF版本的XAML不允许我们以这种方式绑定事件处理程序。必须在MainWindow类内的代码隐藏文件中定义事件处理程序。我不知道这是一个错误,一个意外遗漏的功能,或者我们甚至不应该使用这个功能,但这阻止我们定义一个集中位置来处理所有命令'Executed和CanExecute事件。
解决方法是在代码中定义绑定:
window.CommandBindings.Add(new CommandBinding(Help,HelpExecuted,HelpCanExecute));
答案 1 :(得分:0)
得到它:
定义你的命令:
public class GrantAccessCommand : ICommand
{
public event EventHandler CanExecuteChanged;
InstalViewModel _viewModel;
public GrantAccessCommand(InstalViewModel instalViewModel)
{
_viewModel = instalViewModel;
}
public bool CanExecute(object parameter)
{
return true;
}
public void Execute(object parameter)
{
_viewModel.OnGrantAccessExecute();
}
}
在视图模型的构造函数中创建命令
public ViewModel()
{
_grantAccessCommand = new GrantAccessCommand(this);
}
在视图模型中公开命令:
public ICommand GrantAccessCommand
{
get { return _grantAccessCommand; }
}
在XAMl中绑定它
<MenuItem x:Name="menuItemGrantAccess" Header="Grant Access"
Command="{Binding GrantAccessCommand}"
IsEnabled=">
</MenuItem>