2010-07-30 3 views
0

Imaginons que j'ai XAML qui ressemble à ceci:Adresser une commande WPF du gestionnaire d'aperçu, et pas coincé dans la boucle

<UserControl.CommandBindings> 
    <CommandBinding Command="ApplicationCommands.Delete" Executed="CommandBinding_DeleteExecuted" PreviewExecuted="CommandBinding_PreviewDeleteExecuted"/> 
</UserControl.CommandBindings> 

Et je code C# qui ressemble à ceci:

private void CommandBinding_DeleteExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 

} 

private void CommandBinding_PreviewDeleteExecuted(object sender, ExecutedRoutedEventArgs e) 
{ 
    //Would like to invoke Delete command from here 
} 

Ce que je voudrais faire est de faire appeler mon gestionnaire de prévisualisation et de faire une vérification personnalisée. Si la vérification personnalisée réussit, je voudrais invoquer à nouveau la commande delete depuis le gestionnaire de prévisualisation (ou plutôt invoquer, si je pouvais faire passer la commande d'origine à travers mon aperçu et exécuter les gestionnaires, ce serait génial) . Donc, à ce stade, lorsque je relance la commande delete, aucun autre XAML n'est impliqué.

Si je réémets la commande Delete de mon gestionnaire de prévisualisation, j'imagine que cela entraînerait le rappel du gestionnaire de prévisualisation (sans fin dans une boucle). Au lieu de cela, je voudrais que la commande re-émise ignore mon aperçu et exécute le gestionnaire et laisse n'importe quel gestionnaire de commande de suppression plus bas dans l'arbre manipule la commande de suppression.

Y at-il un moyen de le faire?

+0

Je ne sais pas exactement ce que vous avez besoin. Donc, si votre vérification personnalisée réussit, vous ne voulez pas que le gestionnaire Exécuté soit appelé? Au lieu de cela, vous voulez qu'il soit appelé sur d'autres commandes sur l'arbre? Et si la commande ne passe pas, vous voulez qu'elle soit appelée? –

+0

Si la vérification personnalisée échoue. alors je ne veux pas que le gestionnaire exécuté soit appelé; à la place rien ne se passe. Si la vérification personnalisée réussit, je veux appeler la commande comme si mon gestionnaire previewexecute n'était pas en place. – Notre

Répondre

0

J'ai une solution basée sur un autre question qui semble fonctionner bien:

private void CommandBinding_PreviewDeleteExecuted(object sender, ExecutedRoutedEventArgs e) 
    { 
     bool ignoreDeleteCommand = DoSomeTest(); 


     if (!ignoreDeleteCommand) 
     { 
      foreach (CommandBinding cb in CommandBindings) 
      { 
       if (cb.Command.Equals(ApplicationCommands.Delete)) 
       { 
        //Unsubscribe from this handler, invoke the Delete command (which will be handled by child) and then 
        //resubscribe to this handler 
        cb.PreviewExecuted -= new ExecutedRoutedEventHandler(CommandBinding_PreviewDeleteExecuted); 
        cb.Command.Execute(null); 
        cb.PreviewExecuted += new ExecutedRoutedEventHandler(CommandBinding_PreviewDeleteExecuted); 
       } 
      } 
     } 
    } 
0

Il n'y a pas - le gestionnaire de commandes finira toujours par frapper le parent en premier; Si vous voulez passer une commande à une autre, elles doivent avoir des noms différents.

Questions connexes