WPF:从代码中取出命令处理程序的问题

时间:2010-12-03 17:35:36

标签: .net wpf xaml

我在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

来做到这一点

有办法吗?

2 个答案:

答案 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>