2009-05-25 12 views
0

Espérons que ce soit simple, mon premier essai sur WPF avec Prism V2 avec M-V-VM et jusqu'à présent, j'ai trouvé tout ce qu'il y a de mieux. My Shell est assez simple, Ribbon Control en haut, DataGrid des tickets du Help Desk sur la gauche, et un TabControl sur la droite.WPF Prism V2 Utilisation de M-V-VM - Ajout d'une vue à une région du ViewModel

Lorsqu'un utilisateur ouvre le ticket sélectionné à partir de la grille de données, je souhaite que le ticket s'ouvre sous la forme d'un onglet dans le contrôle Onglet. Je sais que pour cela, j'ai besoin d'ajouter puis d'activer la Vue dans la région en utilisant RegionManager. Mais le faire depuis le ViewModel ne me semble pas correct, bien que je puisse le faire en utilisant DI (DepenecyInjection) il sonne encore des alarmes dans ma tête pour donner au ViewModel des connaissances sur une vue. Pour ajouter à cela, différents modules ajouteront également d'autres vues (contact, client, etc.) dans le TabControl, je voudrais utiliser DataTemplates pour que le TabControl affiche correctement la vue, quelqu'un peut-il me donner des pointeurs? pour cela aussi.

Merci beaucoup Ben

des réponses complètes vous plaît, pas seulement des liens. C'est à quoi sert StackOverflow!

+0

Je pensais que je venait de confirmer les 2 questions que j'ai ici. Quel est le meilleur endroit pour ajouter par programmation une vue à une région lors de l'exécution? et Comment configurer la région pour utiliser DataTemplates, en combinaison avec M-V-VM et Prism pour choisir la vue à utiliser en fonction de ViewModel? – TheDuke

Répondre

1

MVVM + services = Ultimate Power! Un service est simplement une interface bien connue et enregistrée dans votre conteneur IOC. Lorsque ViewModel doit faire quelque chose en dehors de lui-même, comme par exemple ouvrir un document à onglets, il utilise le service. Ensuite, le service est mis en œuvre au besoin pour le programme particulier.

Par exemple:

public interface IDocumentService 
{ 
    void OpenDocument(IViewModel viewModel); 
} 

internal class DocumentService:IDocumentService 
{ 
    public void OpenDocument(IViewModel viewModel) 
    { 
     // Implement code to select the View for the ViewModel, 
     // and add it to your TabControl. 
    } 
} 

{ 
    // Somewhere in your ViewModel... 
    // Make sure you can get the IDocumentService 
    IDocumentService docService = ioc.Get<IDocumentService>(); 
    docService.OpenDocument(new TicketViewModel()); 
} 
+0

C'est la bonne direction, merci. – TheDuke

0

Les commandes sont le moyen de le faire - vous allez vous envoyer une commande, appelée "RequestBringTicketIntoView"; il va bouillir jusqu'à la fenêtre, où vous le manipulez. Lire l'article de Josh Smith:

http://joshsmithonwpf.wordpress.com/2008/03/18/understanding-routed-commands/

+0

Je ne pense pas que c'est tout à fait ça. Ce que je voudrais, c'est pour une action d'ajouter une nouvelle instance d'une vue avec ViewModel à une autre région dans le shell. Vous ne pouvez pas utiliser les commandes routées avec le modèle M-V-VM, et comme la nouvelle vue devra savoir quoi afficher dans la nouvelle vue, je pense que cela doit être fait dans le ViewModel. – TheDuke

+0

"Vous ne pouvez pas utiliser les commandes routées avec le modèle M-V-VM" Pourquoi pas? –

+2

Corrigez-moi si je me trompe, je ne fais que passer par quelque chose que j'ai lu il y a un moment. Les commandes routées remontent l'arbre visuel. Le ViewModel du modèle M-V-VM ne fait pas partie de l'arborescence Visual et n'est pas censé en savoir quelque chose. – TheDuke

Questions connexes