Bonjour à tous !

Je patauge encore en essayant de mettre en place des applications mettant en place le pattern MVVM.

J'essaye de faire une Master View contenant une listbox populé de personne, et une detail View affichant les détail de du currentItem de ma listbox.
Jusqu'ici, tout va bien, quand je change de sélection sur ma master view mes élément s'affiche bien dans ma detail View. Le problème est que quand je viens a modifier une personne grâce a ma detail View, les modifications (visuelles) ne se répercute pas dans ma lisbox.

Alors pour détailler un peu plus, j'ai ma MasterView.xaml qui resssemble à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
DataContext="{Binding Master_VM, Source={StaticResource ServiceLocator}}">
 
    <Grid x:Name="LayoutRoot" Background="White">
        <ListBox Grid.Row="0" Grid.Column="0" ItemsSource="{Binding View,Mode=TwoWay}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid Height="30">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="35"></ColumnDefinition>
                            <ColumnDefinition MinWidth="100"></ColumnDefinition>
                            <ColumnDefinition MinWidth="100"></ColumnDefinition>
                            <ColumnDefinition></ColumnDefinition>
                        </Grid.ColumnDefinitions>
 
                        <Image Grid.Column="0" Source="{Binding ImageSource,Mode=TwoWay}" HorizontalAlignment="Left" Height="30" Width="30"></Image>
                        <TextBlock Grid.Column="1" Text="{Binding Name,Mode=TwoWay}"></TextBlock>
                        <TextBlock Grid.Column="2" Text="{Binding SurName,Mode=TwoWay}"></TextBlock>
                        <TextBlock Grid.Column="3" Text="{Binding Path=BirthDate,Mode=TwoWay}"></TextBlock>
 
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
le datacontext de cette dernière est lié a mon masterViewModel grâce à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
DataContext="{Binding Master_VM, Source={StaticResource ServiceLocator}}"
car j'essaye de respecter le pattern d'inversion de contrôle.

Mon MasterViewModel ressemble à ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 public class Master_ViewModel : ViewModel
    {
        public CollectionViewSource source { get; set; }
 
        public ICollectionView View
        {
            get
            {
                return source.View;
            }
        }
 
        public Master_ViewModel()
        {
            //Pour remplir la liste de personne
            Data.Populate();
 
            this.source = new CollectionViewSource();
            source.Source = Data.ListPersonne;
        }
    }
Ma DetailView.xaml (je laisse que l'utile) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
<Grid x:Name="LayoutRoot" Background="White">
        <TextBox Text="{Binding Path=View.CurrentItem.Name,Mode=TwoWay}" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center" HorizontalAlignment="Stretch" Name="Tb_Name" Margin="0,0,10,0"></TextBox>
        <TextBox Text="{Binding Mode=TwoWay, Path=View.CurrentItem.SurName}" Grid.Column="1" Grid.Row="1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Name="Tb_SurName" Margin="0,0,10,0"></TextBox>
        <sdk:DatePicker  SelectedDate="{Binding Path=View.CurrentItem.BirthDate, Mode=TwoWay}" Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Name="Dp_BirthDate" Margin="0,0,10,0"></sdk:DatePicker>
        <Image Grid.Column="1" Grid.Row="3" Source="{Binding Path=View.CurrentItem.ImageSource,Mode=TwoWay}" Height="75" Width="75"></Image>
 
    </Grid>
Du coup je savais pas trop comment récuperer le CurrentItem de mon MasterViewModel, alors j'ai binder le datacontext de ma detailView sur le MasterViewModel comme ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
DataContext="{Binding Source={StaticResource ServiceLocator}, Path=Master_VM}"
Mais c'est pas logique que je Bind mon MasterViewModel sur la vue detail

Je m'emmêle un peu les pinceau là. Si je fait comme je viens de faire il m'est impossible de déclencher le OnPropertyChanged pour que les changement detail se répercute sur la listbox du master. La logique voudrait que je bind le datacontext de ma Vue detail avec mn DetailViewModel, mais alors comment récupérer le CurrentItem ?

Je pense ne pas utiliser le MVVM correctement...

Cordialement MoZo