2009-03-03 13 views
2

J'ai une classe ViewModel que je veux répondre à la commande intégrée Refresh qui est déclenchée à partir d'un bouton mais je ne suis pas sûr de savoir comment déclarer CommandTarget.Obtention d'objets non-interface utilisateur pour répondre aux liaisons de commandes WPF

En bref, mon code est comme ci-dessous

Le constructeur ViewModel et CanExecute et gestionnaires d'événements Exécuté -

public ViewModel() 
    { 
     CommandBinding binding = new CommandBinding(NavigationCommands.Refresh, CommandHandler); 
     binding.CanExecute += new CanExecuteRoutedEventHandler(binding_CanExecute); 
     binding.Executed += new ExecutedRoutedEventHandler(binding_Executed); 
     CommandManager.RegisterClassCommandBinding(typeof(ViewModel), binding); 
    } 
    void binding_Executed(object sender, ExecutedRoutedEventArgs e) 
    { 
     Debug.Print("Refreshing..."); 
    } 

    void binding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = true; 
    } 

Le balisage est -

<Button Command="Refresh">refresh</Button> 

Maintenant, j'ai essayé de placer le CommandTarget sur ce bouton à {Binding Source={StaticResource ViewModel}} mais je reçois un temps d'exécution en disant Cannot convert the value in attribute 'CommandTarget' to object of type 'System.Windows.IInputElement'. Je suis nouveau pour les commandes, donc il est tout à fait possible que je suis mal de toutes sortes ici. Toute aide serait appréciée.

Répondre

5

RoutedCommand s et MVVM ne se mélangent pas. RoutedCommand s sont liés à l'arborescence visuelle et dépendent de la collection CommandBindings de WPF. Vous devez implémenter vos propres classes ICommand qui fonctionnent avec le modèle MVVM. Jetez un oeil à Prism's implementations pour les débutants.

Dans mes propres projets MVVM, j'ai quelques implémentations de commande:

  • DelegateCommand. Les appels ont permis aux délégués de déterminer si la commande pouvait s'exécuter et d'exécuter la commande.
  • ActiveAwareCommand. Fonctionne en conjonction avec une interface (IActiveAware) et envoie les exécutions de commande à l'élément actuellement actif. Plusieurs implémentations actives actives s'enregistrent avec la commande et la commande route automatiquement les appels CanExecute/Execute vers l'élément actif.
+0

Merci Kent. qui aide – Stimul8d

Questions connexes