2009-10-09 9 views
5

Je crée une application de saisie de données simple sous forme WPF à l'aide du modèle MVVM. Chaque formulaire a un objet présentateur qui expose toutes les données, etc. Je voudrais utiliser les commandes WPF pour activer et désactiver les boutons Modifier/Enregistrer/Supprimer et les options de menu.Commandes WPF - Exécution sans code par défaut

Mon problème est que cette approche semble m'obliger à ajouter beaucoup de code au code-behind. J'essaie de garder ma couche de présentation aussi mince que possible, donc je préfère que ce code/logique soit dans ma classe de présentateur (ou ViewModel) plutôt que dans le code-behind. Quelqu'un peut-il suggérer un moyen de parvenir à la même chose sans code-behind?

Mon XAML ressemble un peu à ceci:

<Window.CommandBindings> 
    <CommandBinding 
     Command="ApplicationCommands.Save" 
     CanExecute="CommandBinding_CanExecute" 
     Executed="CommandBinding_Executed" 
    /> 
</Window.CommandBindings> 

et mon code-behind ressemble un peu à ceci:

private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = (
     _presenter.SelectedStore != null && 
     _presenter.SelectedStore.IsValid); 
} 

Répondre

11

Le Model-View-ViewModel (MVVM) Le modèle de conception vise à atteindre exactement cet objectif, et excellent article de Josh Smith explique comment l'appliquer.

Pour les commandes, vous pouvez utiliser la classe RelayCommand décrite dans l'article.

Étant donné que vous avez déjà un objet présentateur, vous pouvez laisser cette classe exposer une propriété ICommand qui implémente la logique souhaitée, puis lier le code XAML à cette commande. Tout est expliqué dans l'article.

+0

Grand lien - Cheers! –

0

Si vous cherchez spécifiquement à lier une commande dans le ViewModel à l'une des commandes d'application de XAML, vous devez créer l'infrastructure pour le faire vous-même. Je marche bien faire que in this answer ce qui vous permet alors de faire quelque chose comme ceci:

<local:RoutedCommandHandlers.Commands> 
    <local:RoutedCommandHandler RoutedCommand="ApplicationCommands.Save" 
           Command="{Binding TheSaveCommand}" /> 
</local:RoutedCommandHandlers.Commands> 
Questions connexes