2010-12-03 37 views
2

我有些命令綁定在我的XAML定義:WPF:問題採取命令處理出來的代碼背後

<UserControl.CommandBindings> 
    <CommandBinding 
     Command="commands:Commands.GrantAccessCommand" 
     Executed="HelpExecuted" /> 
</UserControl.CommandBindings> 

所以GrantAccessCommand位於所謂的命令和HelpExecuted是在我的代碼後面一個單獨的類。它工作正常。現在,當我將HelpExecuted放在其他類中時,我得到一個錯誤「... HelpExecuted」不是有效的事件處理程序方法名稱,只有生成的或代碼隱藏類中的實例方法纔有效。代碼:

Executed="commands:Commands.HelpExecuted" 
//I also tryed: Executed="x:Static commands:Commands.HelpExecuted" 

我知道我可以在代碼中做到這一點的背後使用CommandBindings.Add(新的CommandBinding(GrantAccessCommand,HelpExecuted));但我想用XAML來做到這一點

有沒有辦法?

+0

您使用的是.NET 3.5還是.NET 4? – 2010-12-03 17:55:35

回答

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> 
1

我的猜測是.Net 3.5。從http://www.codeproject.com/KB/WPF/CentralizingWPFCommands.aspx:當前的WPF版本的XAML不允許我們以這種方式綁定事件處理程序。事件處理程序必須在MainWindow類的代碼隱藏文件中定義。我不知道這是一個錯誤,一個意外遺漏的功能,或者我們甚至不應該使用這個功能,但是這阻止我們定義一個集中位置來處理所有命令的Executed和CanExecute事件。

的解決方法是在代碼來定義綁定:

window.CommandBindings.Add(新的CommandBinding(幫助,HelpExecuted,HelpCanExecute));