2010-11-11 5 views
3

Je suis en train d'écrire une petite application pour apprendre WPF/MVVM et j'ai en quelque sorte couru dans une énigme, j'ai un objet viewmodel prêt à partir, mais je ne sais pas où l'utiliser. Le viewmodel représente une seule donnée Windows (certaines valeurs de curseurs, une valeur de barre de progression et quelques chaînes de texte), dont certaines sont directement attachées au modèle, d'autres sont dans le viewmodel pour éviter d'ajouter de nouvelles fonctionnalités au modèle.Où dois-je utiliser mon objet view-model?

Je n'aurai besoin que de 1 de ces objets à la fois (par fenêtre, mais je n'autorise qu'une seule fenêtre), bien qu'il ne s'agisse pas d'un singleton. Cela va exister pour la durée de vie de la fenêtre (est-ce normal?)

Donc ma question est la suivante: Dois-je utiliser le viewmodel comme une ressource statique dans le App.Xaml, en tant que membre de l'App.xaml. cs class dans le code derrière (à l'intérieur d'une méthode "OnStartup" substituée) ou en tant que ressource dans le fichier Window.xaml, ou en tant qu'objet dans le fichier Window.xaml.cs. J'ai vu des gens le mettre comme une ressource locale et comme un objet global dans le démarrage, mais pour moi, il semble qu'il ne devrait pas être dans le code derrière (tout ce que je fais est de le jeter en l'air Une fois qu'il est en place, il peut s'occuper de tout le reste.

Donc, des pensées sur où le viewmodel devrait être instancié?

Répondre

4

Il est tout à fait normal que le modèle de vue d'une fenêtre n'existe que pour la durée de vie de sa fenêtre. La création peut être aussi simple que de mettre:

DataContext = new MainWindowViewModel(); 

dans le constructeur pour MainWindow. C'est comme ça que je le fais en l'absence d'une raison impérieuse de ne pas le faire. (Si la fenêtre doit interopérer avec le modèle de vue dans ses gestionnaires d'événements, ce qu'elle fait parfois, je vais créer un champ privé pour l'objet afin que je ne doive pas continuer à lancer DataContext dans tous les gestionnaires d'événements.

Habituellement, le modèle de vue doit interopérer avec un ou plusieurs objets de domaine. Le défi dans ce cas est de trouver un moyen de dire au modèle de vue à propos de cet objet sans coupler l'objet domaine à la fenêtre qui crée le modèle de vue. C'est là que vous commencez à visser avec des services et des localisateurs de service et des objets factices et autres.

Mais même quand vous faites cela, vous pouvez toujours créer le modèle de vue simplement dans le constructeur de la fenêtre, par exemple:

ServiceLocator loc = (ServiceLocator) FindResource("AppServiceLocator"); 
DataContext = new MainWindowViewModel(loc); 

La seule fois que je ne pas créer le modèle de vue d'une fenêtre dans la fenêtre de constructeur est lorsque l'autre objet - comme une commande dans une autre fenêtre - est en train de créer la fenêtre et de définir son DataContext.

0

Je passe généralement par le concept d'un ViewModelLocator. ViewModelLocator est une StaticResource dans App.xaml.

Le ViewModelLocator utilise pour l'injection tire parti IoC Dependecy (Ninject/unité/...) et il est possible de définir un champ d'application de la DI pour le Livetime de votre ViewModel ...

Il y a aussi quelques blogposts là-bas qui fonctionnent avec MEF et le Concept ViewModelLocator ...

Questions connexes