using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using ManageUsers.Model;
using System.Windows.Input;
namespace ManageUsers.ViewModel {publicclass MainViewModel : ViewModelBase {public MainViewModel(){
CurrentViewModel = MainViewModel._firstViewModel;
GotoEdit = new RelayCommand(() => CurrentViewModel = _firstViewModel);
GotoList = new RelayCommand(() => CurrentViewModel = _secondViewModel);
}private ViewModelBase _currentViewModel;
readonlystatic ListViewModel _firstViewModel = new ListViewModel();
readonlystatic EditViewModel _secondViewModel = new EditViewModel();
public ViewModelBase CurrentViewModel {get{return _currentViewModel;
}set{if(_currentViewModel == value)return;
_currentViewModel = value;
RaisePropertyChanged("CurrentViewModel");
}}public ICommand GotoEdit {get; privateset; }public ICommand GotoList {get; privateset; }}}
Dans tous les exemples en ligne que j'ai consulté, le bouton pour changer de vue est au niveau du MainWindow, à côté de <ContentControl />.
Mais comment changer de vue si le bouton est au niveau du UserControl ? Comment remonter la commande de ListView à MainViewModel ?
Merci.
03/10/2016, 21h28
micka132
Je comprends pas le soucis, avec le code que tu as tu binds juste la commande de tes boutons à tes RelayCommand et ca devrait fonctionner.
Ou alors justement tu veux savoir comment faire pour mettre les boutons à l’intérieur d'une "vue" un peu ou tu en as envie, ou même pouvoir naviguer sans boutons (traitement issue d'une logique quelconque).
Dans ce cas là si tu veux garder un couplage faible stricte il faut passer par une messagerie, Messenger pour mvvm light.
Ton Main est abonné à 2 types de messages différent, et lorsqu'il en reçoit un va simplement modifier le CurrentViewModel comme le font tes RelayCommand.
Tu peux également faire une entorse au couplage strict et considérer que ton Main va pas changer tout les 4 matins et exposer des commandes statics ou avoir une reference de ton main dans chacune des autres viewmodels. Je suis pas trop fan, mais le systeme de messagerie peut vite devenir compliqué à maintenir!
04/10/2016, 10h13
Daïmanu
Hello.
C'est ça le soucis, la vue n'a accès qu'aux RelayCommands de sa vue-modèle (ListViewModel.cs) qui elle n'a pas n'a pas accès à la vue-modèle principale (MainWindowViewModel.cs), à moins de jongler avec les DataTemplate / Binding que je ne maitrise absolument pas.
L'histoire des Messages me plait bien, je vais regarder de ce côté là.
Merci.
04/10/2016, 11h35
Daïmanu
J'ai pu me dépatouiller grâce aux messages et faire ce que je voulais.
Du coup j'ai un fonction qui Register les messages dans le MainViewModel, et le message est envoyé lors de l'appui du bouton.