2010-10-31 3 views
0

Quelques questions de base, mais la plupart des exemples que je vois, que d'une seule vue avec un viewmodel et un viewmodellocator, donc mes questions sont:Comment transmettre des données (. Par exemple selectedItem) d'une vue à une autre vue à l'aide viewmodel

  • Chaque viewmodel possède-t-il son propre viewmodellocator? (L'extrait inclus dans la boîte à outils mvvm light pour un viewmodellocator semble impliquer ceci, car il génère certaines méthodes, par exemple, cleanup qui a le même nom pour chaque viewmodellocator que vous créez)
  • Les vues DataContext sont liées à ViewModeLocator, mais comment? peut-on préciser qu'il a un argument (par exemple. vous voulez que ce ViewModel pour récupérer un certain dossier client)

Répondre

0

Votre ViewModelLocator (Locator) devrait avoir une propriété pour chaque ViewModel que vous avez.

Exemple: vous avez un ExampleViewModel ViewModel classe

  • Dans Locator classe: ExampleViewModel devrait être une propriété
  • En View1 XAML: DataContext="{Binding ExampleViewModel, Source={StaticResource Locator}}"
  • En View2 XAML: DataContext="{Binding ExampleViewModel, Source={StaticResource Locator}}"

Vous devrait être capable de se lier à l'un de vos ViewModels que vous avez spécifié dans le Locator ET en autant de vues que vous voulez (pas sûr à 100% sur la 2ème partie).

+0

Je ne comprends pas toutes les viewmodels étant statique. Quand je veux ouvrir une fenêtre d'édition, elle montrera toujours les mêmes données. Je m'attendais à être capable de créer une nouvelle instance de viewmodel pour la fenêtre d'édition (supposons que vous pouvez avoir 2 fenêtres d'édition du même type, ouvertes en même temps ... ce n'est pas possible avec un viewmodel statique). Créer une nouvelle instance assurerait également, toutes les propriétés étant définies à leurs valeurs par défaut (par exemple certaines propriétés pour activer/désactiver les boutons, entre autres) – rekna

+0

Vous pourriez essayer quelque chose comme: Dans MainWindow, l'utilisateur clique sur Edit qui pointe vers RelayCommand EditCommand; Ensuite, dans ViewModel de MainWindow, vous avez un ObservableCollection Editors {get; private set;}, et dans EditCommand {Editors.Add (nouveau EditViewModel() {/ * set Defaults * /}); } –

1

Vous ne devez disposer que d'un seul localisateur ViewModel capable de servir le bon ViewModel pour votre vue correspondante.

Habituellement, le ViewModelLocator fonctionne avec une sorte de IoC Framwork pour injecter ViewModels à la bonne situation. Exemple: vous avez un DisgnTimeViewModel et un RuntimeViewModel et le Locator est responsable de déterminer lequel doit passer. Un autre point est ... vous pouvez facilement définir votre ViewModel dans Xaml sur la propriété DataContext de UserControl. Cela ne fonctionne que lorsque votre ViewModel ctor est sans paramètre. Lorsque vous voulez injecter des services, vous pouvez également le faire via IOC et laisser le ViewModelLocator découvrir le câblage et l'instanciation ...

Pour passer des objets et des arguments, je vous recommande de consulter le concept de l'EventAggregator ou de Messenger dans MVVM Toolkit Light. Les messages sont envoyés en couple et chaque ViewModel qui s'abonne peut recevoir ces messages. Il est également possible d'avoir une charge utile dans un tel message comme un ID ou un objet ...

espérons que cette aide ....

Questions connexes