9
votes

MVVM Manipulation des exceptions

J'ai une application WPF que j'ai essayé d'écrire dans le style MVVM. Si une exception est lancée (comme lorsqu'un document est ouvert), j'aimerais afficher une boîte à lettres. Facile à faire, mais mon code ne se sent pas tout à fait raison, car le message MessageBox.Show est dans le modèleView. Je pensais que ce genre de chose est censé vivre dans la vue, mais je ne suis pas censé mettre du code à la vue.

La question peut donc être distillée à distance à quel est le moyen suggéré d'afficher une boîte à MVVM?


0 commentaires

3 Réponses :


17
votes

Utiliser un service:

public void SomeMethodInYourViewModel()
{
    try
    {
        DoSomethingDangerous();
    }
    catch (Exception ex)
    {
        ServiceLocator.Resolve<IMessageService>().ShowMessage(ex.Message);
    }
}


3 commentaires

+1: En outre, une alternative à l'utilisation d'un servicelocator serait d'utiliser une injection de dépendance afin d'injecter les imessageervice dans les VMS au besoin.


En raison du découplage de la couche de présentation, vous pouvez tester votre point de vue de votre viewModel.


Où est le serveurélocator défini? Le nom ne me résout pas pour moi, et ni les indices de VS ni MSDN ne me donnent de plomb.



9
votes

Regardez l'excellente fondation MVVM de Josh Smith sur Codépex . Spécifiquement, consultez la classe Messenger, une manière légère de transmettre des messages entre divers objets de menuModel qui n'ont pas besoin d'être conscients de l'autre.

En outre, je ne crois pas qu'il existe une règle dure et rapide sur "Aucun code dans la vue", bien qu'il soit préférable d'éviter si possible si possible ... N'oubliez pas que votre XAML est simplement le code .NET écrit dans une syntaxe déclarative; Le code-derrière est juste C # ou vb.net pour compléter cela (si absolument nécessaire!)


1 commentaires

+1 pour le peu d'ignorer la règle "Aucun code en vue". De toute façon, c'est plus d'une ligne directrice. :)



2
votes

Vous pouvez également aimer simplement mettre une propriété ErrormSage String sur votre classe ViewModel que votre vue peut se lier à.


0 commentaires