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.
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? –
pouvez-vous nous montrer votre code de starview? où vous vous inscrivez à l'événement? – blindmeis
et quel est votre message d'erreur? – blindmeis