2010-06-28 2 views
1

J'ai trouvé comment fermer la fenêtre de mon ViewModel.WPF appel MVVM ViewModel Enregistrer la méthode sur la fenêtre Fermer

Maintenant, j'ai besoin de résoudre le problème de fermeture de fenêtre de l'autre côté.

J'ai besoin de déclencher la méthode Save() dans mon ViewModel lorsque l'utilisateur clique sur le bouton de fermeture de la fenêtre.

Je pensais à lier la propriété Command à l'événement de fermeture de Window, mais mon ViewModel est lié au contrôle utilisateur et dans ce cas, la commande Close ne sera pas exécutée.

Je regardais aussi cette question Disposing WPF User Controls, mais j'ai peur que mettre la méthode Save dans la méthode Dispose soit un peu trop tard.

Est-il possible de résoudre ce problème?

Merci beaucoup!

Répondre

1

Je pense que la meilleure solution pour cela serait d'enregistrer le ViewModel à un événement de votre contrôle qui est également enregistré à l'événement fermé de votre fenêtre. De cette façon, vous pouvez également enregistrer d'autres ViewModels à l'événement windowClosed dans le futur pour lever d'autres méthodes save() dans d'autres ViewModels

+0

Cela a fonctionné pour moi .... Merci :) –

3

Si vous avez toujours besoin de sauvegarder à la fermeture, pourquoi ne pas appeler la méthode Save() à partir de Close () dans le ViewModel au lieu de la View? Ensuite, assurez-vous que la fenêtre se ferme uniquement à partir de ViewModel et non à partir de la vue elle-même. Quelque chose comme (non testé, mais vous obtenez l'idée)

public class SaveOnCloseViewModel 
{ 
    public event Action RequestClose; 
    ... 
    public void Close() 
    { 
     Save(); 
     RequestClose(); 
    } 
} 

public class SaveOnCloseView 
{ 
    private SaveOnCloseViewModel _vm; 
    public SaveOnCloseView(SaveOnCloseViewModel vm) 
    { 
     _vm = vm; 
     _vm.RequestClose += this.PerformClose; 
     this.OnClosing += Window_Closing; 
    } 

    private bool _isClosing = false; 
    private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) 
    { 
     if (!_isClosing) 
     { 
      e.Cancel = true; 
      _vm.Close(); 
     } 
    } 

    private void PerformClose() 
    { 
     _isClosing = true; 
     this.Close(); 
    } 
} 

Questions connexes