2009-06-21 6 views
6

J'aime l'idée MVVM d'un RelayCommand qui est exposée par le ViewModel. C'est agréable et élégant, pour les opérations qui peuvent être effectuées sans autre intervention de l'utilisateur. Simple. Testable.MVVM et les commandes qui montrent plus d'interface graphique

Cependant, toutes les opérations ne sont pas sans interface utilisateur. Certains nécessitent une confirmation ("Êtes-vous sûr de vouloir supprimer?"). D'autres nécessitent encore plus d'informations. Ouverture d'un fichier peut entraîner n'importe quoi à partir d'une boîte de dialogue Ouvrir un fichier à travers un assistant d'importation à part entière.

Quelle est la meilleure façon, au sein d'une application MVVM, d'écrire des commandes nécessitant une saisie par l'utilisateur? Existe-t-il un modèle établi pour résoudre cela avec injection de dépendance en quelque sorte? Dois-je écrire un gestionnaire KeyDown dans le code-behind, et le faire explicitement exécuter l'événement? Devrais-je me rabattre sur RoutedUICommand, et mettre tout le code "afficher le GUI suivant" dans ma vue? Ou y a-t-il quelque chose d'évident que je suis totalement absent?

Répondre

4

J'utilise habituellement Dependency Injection pour injecter une sorte de chose abstraite IShowTheInterface, puis invoquer des méthodes sur l'abstraction depuis la commande. Ces méthodes devraient ensuite vous donner les réponses dont vous avez besoin pour déterminer si vous voulez continuer avec l'action et quelle entrée l'utilisateur a donné. J'ai récemment utilisé ceci comme un exemple dans un blog post with a bit of a different topic.

1

Ce type de contenu (boîtes de dialogue de confirmation, boîtes de dialogue d'ouverture de fichier, etc.) est généralement partagé entre les applications. Donc, je préfère ne pas les mettre dans le ViewModel. ViewModel est spécifique à l'application, et il n'est pas recommandé de développer ViewModelBase indéfiniment. Au lieu de cela, créez des comportements réutilisables pour étendre la vue. Il y a Quete quelques échantillons de comportement au Expression Blend Gallery

EDIT:

Behaviors peuvent avoir des propriétés et vous pouvez utiliser ces propriétés non seulement pour préciser les caractéristiques de comportement, mais aussi d'obtenir des commentaires:

<Button Content="Open Document"> 
    <i:Interaction.Behaviors> 
     <local:FileOpenBehavior 
      FileNameTarget="{Binding ElementName=tbDocName}"/> 
    </i:Interaction.Behaviors> 
</Button> 

Dans l'exemple ci-dessus, tbDocName peut être masqué - ou vous pouvez lier à une propriété de votre ModelView.

+0

La partie "Afficher une boîte de dialogue ouverte" peut être réutilisable; mais alors vous devez faire quelque chose avec ce fichier, et cela va être spécifique à l'application, donc je ne suis pas sûr de voir comment cela fonctionne. Pouvez-vous donner un exemple de la façon dont vous feriez cela avec des comportements? –

+0

@ joe-white Envoyez un message routé vers le haut de la pile de l'interface utilisateur qui sera interceptée et relayée vers un ViewModel ... Ou si vous liez une propriété sur un ViewModel, vous saurez que le fichier est affecté lorsque la propriété change. –