2010-12-03 14 views
2

J'ai une commande liaison définie dans mon XAML:WPF: Problème avec la prise de gestionnaires de commandes de code derrière

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

Alors GrantAccessCommand est situé dans une classe séparée appelées commandes et HelpExecuted est dans mon code derrière. Ça fonctionne bien. Maintenant, lorsque je place aussi HelpExecuted dans l'autre classe, j'obtiens une erreur "... HelpExecuted" n'est pas un nom de méthode de gestionnaire d'événements valide.Seules les méthodes d'instance sur la classe générée ou code-behind sont valides. " Le code:

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

Je sais que je peux le faire dans le code derrière l'utilisation CommandBindings.Add (nouveau CommandBinding (GrantAccessCommand, HelpExecuted)); Mais je veux le faire en utilisant XAML

Y at-il un moyen?

+0

Utilisez-vous .NET 3.5 ou .NET 4? –

Répondre

0

Got avec ceci:

Définissez votre commande:

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(); 
    } 
} 

Créer la commande dans le constructeur du modèle de vue

public ViewModel() 
    { 
     _grantAccessCommand = new GrantAccessCommand(this); 
    } 

Expose commande dans votre modèle de vue:

public ICommand GrantAccessCommand 
    { 
     get { return _grantAccessCommand; } 
    } 

Se lier à lui dans XAMl

<MenuItem x:Name="menuItemGrantAccess" Header="Grant Access" 
    Command="{Binding GrantAccessCommand}" 
    IsEnabled="> 
</MenuItem> 
1

Je pense que .Net 3.5. De http://www.codeproject.com/KB/WPF/CentralizingWPFCommands.aspx: Le code XAML de la version WPF actuelle ne nous permet pas de lier les gestionnaires d'événements de cette manière. Les gestionnaires d'événements doivent être définis dans le fichier code-behind dans la classe MainWindow. Je ne sais pas s'il s'agit d'un bug, d'une fonctionnalité laissée de côté ou si nous ne sommes même pas censés utiliser cette fonctionnalité, mais cela nous empêche de définir un emplacement centralisé pour gérer les événements Executed et CanExecute de toutes les commandes.

La solution consiste à définir les liaisons dans le code:

window.CommandBindings.Add (nouveau CommandBinding (Aide, HelpExecuted, HelpCanExecute));