Bonjour,

Je teste en ce moment le pattern MVVM. J'ai donc une classe Messenger qui s'occupe de transférer des messages entre mes ViewModel.

Voilà mon problème :
Mon application à une vue principale qui contient les éléments suivants :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
    <Grid>
        <v:MasterView Grid.Column="0" Grid.Row="1" />
        <ContentControl Grid.Column="1" Grid.Row="1" Content="{Binding Path=CurrentViewModel}">
            <ContentControl.Resources>
                <DataTemplate DataType="{x:Type vm:ZoneViewModel}">
                    <v:DetailZoneView />
                </DataTemplate>
            </ContentControl.Resources>
        </ContentControl>
    </Grid>
En gros, MasterView est un treeview et le ContentControl va recevoir la vue détail du noeud sélectionné.

Mon ViewModel maitre (MasterViewModel, lié à ViewModel) maintient une collection de ViewModel enfants (le maitre correspond au treeview et les enfants correspondent aux nœuds du treeview). Je me suis basé sur le second exemple de Josh Smith dans cet article.
Chaque ViewModel enfant contient entre autres une propriété IsSelected. Lorsque cette propriété est affectée, mon ViewModel enfant envoie alors deux messages via mon implémentation du pattern mediator :
- un premier pour indiquer quel ViewModel est à afficher dans la partie détail
- un second pour passer les data
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
        public ZoneViewModel(IMessengerService messenger, Zone zone) : base(null)
       {
            _zone = zone;
            PropertyChanged +=
                (s, e) =>
                {
                    if (e.PropertyName.Equals("IsSelected") && IsSelected)
                    {
                        _messenger.Send(this, MessengerMessages.SelectedViewModel);
                        _messenger.Send(this, MessengerMessages.SelectedZone, _zone);
                    }
                };
Le premier message est consommé par mon ViewModel principal qui contient une propriété CurrentViewModel.
Le second message est consommé par le ViewModel détail pour récupérer l'objet qu'il doit afficher. (dans mon exemple : DetailZoneViewModel).

Le problème est que mes deux messages sont traités immédiatement sans laisser une chance à la vue principale d'exécuter le datatemplate qui va instancier DetailZoneView. Donc la 1ère fois, le second message n'est traité par personne. Les fois suivantes, tout se comporte comme prévu.

Y'a-t'il un moyen de forcer dans un ViewModel l'exécution du code XAML après un RaiseNotifyPropertyChanged avant de rendre la main ? Histoire d'être sûr que mon application est bien dans l'état attendu avant de traiter les messages suivants...