2010-10-26 12 views
3

Je tente de réécrire mon application à l'aide du modèle MVVM.MVVM ViewModel et méthodes statiques

J'ai une fenêtre pour afficher les documents connexes pour des objets différents avec des méthodes statiques comme celui-ci:

public partial class ShowRelatedDocuments : Window 
    { 

    private ShowRelatedDocuments() 
    { 
     InitializeComponent(); 
    } 

    public static void ShowRelatedDocument(A objA) 
    { 
     ShowRelatedDocuments srd = new ShowRelatedDocuments(); 
     srd.HandleA(objA); 
     srd.ShowDialog(); 
    } 

    public static void ShowRelatedDocument(B objB) 
    { 
     ShowRelatedDocuments srd = new ShowRelatedDocuments(); 
     srd.HandleB(objB); 
     srd.ShowDialog(); 
    }} 

est-il un moyen de garder ces méthodes statiques comme ça?

ShowRelatedDocumentsVM.ShowRelatedDocument(A objA); 
ShowRelatedDocumentsVM.ShowRelatedDocument(B objB); 

Je n'ai rien trouvé à propos de ViewModels et des méthodes statiques. Une machine virtuelle peut-elle créer une instance de lui-même et afficher sa vue (ici une fenêtre)?

Ou est le meilleur moyen de passer les objets en tant que paramètre au constructeur de la VM comme ceci?

public ShowRelatedDocumentsVM(A objA) 
{ 
    HandleA(obj A) 
    ShowRelatedDocuments srd = new ShowRelatedDocuments(); 
    srd.DataContext = this; 
    srd.ShowDialog(); 
} 

public ShowRelatedDocumentsVM(B objB) 
{ 
    HandleB(objB); 
    ShowRelatedDocuments srd = new ShowRelatedDocuments(); 
    srd.DataContext = this; 
    srd.ShowDialog(); 
} 

Ou sont les deux façons de mal, parce que je ne respectent pas le modèle MVVM en raison création de la vue dans le viewmodel?

Thx à l'avance.

Répondre

2

Comment afficher les boîtes de dialogue est l'un des domaines de MVVM qui n'est pas immédiatement clair, et il existe un certain nombre de façons dont le comportement peut être atteint.

Je suggère d'utiliser soit un médiateur (comme décrit here) ou en injectant une dépendance du modèle de vue qui contrôle les boîtes de dialogue:

interface IDialogService 
{ 
    void ShowRelatedDocumentsA(A a); 
} 

...

class MyViewModel 
{ 
    private IDialogService _dialogService 

    public MyViewModel(IDialogService dialogService) { _dialogService = dialogService; } 

    public void DoSomething() 
    { 
     _dialogService.ShowDialog(...); 
    } 
} 

ou l'autre de ceux-ci peuvent vous permettra de contrôler la création de la vue en dehors du modèle de vue, et supprimera toutes les références explicites de VM -> V.

+0

L'IDialogService ou IMessageBoxSer vice est la façon la plus commune que j'ai vu ce problème résolu. C'est aussi testable. +1 –