2010-09-24 5 views
2

J'utilise MVVM Foundation mais je pense que c'est assez simple et pas vraiment spécifique au framework. Ma configuration est la suivante:MVVM Foundation: Comment fermer la fenêtre d'application de ViewModel

  • StartViewModel - a une commande exit qui renvoie un RelayCommand/ICommand

    public ICommand ExitCommand { 
        get { return _exitCommand ?? (_exitCommand = new RelayCommand(() => MessageBox.Show("Hello World"))); } 
    } 
    public RelayCommand _exitCommand; 
    
  • StartView (Contrôle utilisateur) a un bouton binded la commande exit

    <Button Content="Exit" Command="{Binding ExitCommand}" /> 
    

Répondre

3

Commencez par lire autant que vous le pouvez sur MVVM, par ex. WPF Apps With The Model-View-ViewModel Design Pattern sur MSDN. Une fois que vous aurez compris les principes de base, la réponse semblera plus raisonnable.

Fondamentalement, vous souhaitez conserver vos View (UI) et ViewModel (interface abstraite essentiellement abstrait, mais aussi modèle abstrait) couches separate et découplé. Afficher une boîte de message ou fermer une fenêtre doit être considéré comme un détail spécifique à l'interface utilisateur et donc implémenté dans la vue, ou dans le cas d'une boîte de message, plus généralement disponible via un «service».

En ce qui concerne ViewModel, ceci est réalisé en utilisant Inversion of Control (IoC). Prenez l'exemple de boîte de message ci-dessus. Plutôt que d'afficher la boîte de message elle-même, elle dépend d'un IMessageBoxService qui a une méthode Show et les appels ViewModel qui à la place - déléguer la responsabilité. Cela pourrait être pris plus loin en tirant parti des conteneurs Dependency Injection (DI).

Une autre approche utilisée pour fermer une fenêtre d'affichage peut être que ViewModel expose un événement, appelé par exemple RequestClose (comme dans l'article MSDN) auquel la vue s'abonne. Alors le ViewModel soulèverait l'événement quand il veut que la vue/fenêtre correspondante se ferme; il suppose que quelque chose d'autre écoute et prendra la responsabilité et le fera réellement.

+0

Salut, j'ai lu l'article et j'ai essayé de l'implémenter. 'CloseCommand = new RelayCommand (() => RequestClose (null, EventArgs.Empty))' quand je clique sur le bouton lié à 'CloseCommand', je me suis effondré. y a-t-il quelque chose qui ne va pas? –

+0

pouvez-vous nous montrer votre code de starview? où vous vous inscrivez à l'événement? – blindmeis

+0

et quel est votre message d'erreur? – blindmeis

1

vous pouvez implémenter un CloseEvent dans votre StartViewModel. dans votre StartView, vous devez enregistrer ce CloseEvent. Lorsque vous élevez votre closeevent de votre machine virtuelle, votre View reconnaît qu'elle doit fermer votre application/fenêtre.

Questions connexes