Bonjour,
J'ai une grille qui contient une liste d'adresses (string nom, string pays, string ville).
Dans cette grille j'ai donc 3 colonnes :
- nom : TextBox
- pays : ComboBox
- ville : ComboBox

Ce que je veux faire c'est changer la liste des villes possibles en fonction du pays sélectionné pour ne pouvoir sélectionner que les villes dans ce pays.
Pour ce faire, j'ai ajouté une liste de villes dans mon entité Adresse, que je rempli avec toutes les villes puis j'utilise un Converter qui transforme cette liste de toutes les villes en liste de villes possibles.
Ceci fonctionne au premier chargement, mais dès que je change le pays sur une ligne, la conversion ne se lance pas.

Voici mes 3 entités:
Adresse
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
24
25
26
27
28
29
30
31
 
    [DataContract]
    [RoundtripOriginal]
    public class Adresse
    {
        [Key]
        [DataMember]
        [Required(ErrorMessage = "Champ NOM est obligatoire")]
        [ColumnInfos("NOM")]
        public string NOM{ get; set; }
 
        [DataMember]
        [ColumnInfos("PAYS")]
        public string PAYS{ get; set; }
 
        [DataMember]
        [ColumnInfos("VILLE")]
        public string VILLE{ get; set; }
 
        private int cle;
        [DataMember]
        public int CLE
        {
            get { return 1; }
            set { cle = 1; }
        }
 
        [Include]
        [Association("association", "CLE", "CLE")]
        public IList<Ville> ToutesLesVilles{get; set;}
    }
J'ai été obligé de créer une fausse CLE pour pouvoir récupérer toutes les villes.

Pays
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
    [DataContract]
    [RoundtripOriginal]
    public class Pays
    {
        [Key]
        [DataMember]
        [Required(ErrorMessage = "Champ PAYS est obligatoire")]
        [ColumnInfos("PAYS")]
        public string PAYS{ get; set; }
    }
Ville
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
24
 
    [DataContract]
    [RoundtripOriginal]
    public class Ville
    {
        [Key]
        [DataMember]
        [Required(ErrorMessage = "Champ VILLE est obligatoire")]
        [ColumnInfos("VILLE ")]
        public string VILLE { get; set; }
 
        [DataMember]
        [Required(ErrorMessage = "Champ PAYS est obligatoire")]
        [ColumnInfos("PAYS")]
        public string PAYS{ get; set; }
 
        private int cle;
        [DataMember]
        public int CLE
        {
            get { return 1; }
            set { cle = 1; }
        }
    }
On retrouve la même clé que dans Adresse

Voici mon Converter, qui va récupérer les villes dont j'ai besoin
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
24
 
public class ToutesVillesToVillesPays : IValueConverter
    {                
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var adresse = (Adresse)value;
            var VillePays= new ObservableCollection<Ville>();
 
            foreach (Ville v in adresse.ToutesLesVilles)
            {
                if (v.PAYS== adresse.PAYS)
                {
                    VillePays.Add(v);
                }
            }
 
            return VillePays;
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Voici ma vue
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
24
25
26
27
28
29
30
31
32
33
 
<UserControl.Resources>
    <PROJET:ViewModel x:Key="ViewModel" />
</UserControl.Resources>
 
<sdk:DataGrid ItemsSource="{Binding Data}" SelectedItem="{Binding CurrentItem, Mode=TwoWay}" SelectionMode="Single">
    <sdk:DataGrid.Columns>
        <sdk:DataGridTextColumn Binding="{Binding NOM}"/>
 
        <sdk:DataGridTemplateColumn Header="Pays">
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox DisplayMemberPath="PAYS" 
                                    ItemsSource="{Binding ListePays, Source={StaticResource ViewModel}}"
                                    SelectedValue="{Binding PAYS, Mode=TwoWay}"
                                    SelectedValuePath="PAYS" 
                                    SelectionChanged="ComboBox_SelectionChanged" />
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
 
        <sdk:DataGridTemplateColumn Header="VILLE">
            <sdk:DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox DisplayMemberPath="VILLE"
                                    ItemsSource="{Binding Converter={StaticResource ToutesVillesToVillesPaysConverter}}"
                                    SelectedValue="{Binding VILLE, Mode=TwoWay}"
                                    SelectedValuePath="VILLE" />
                </DataTemplate>
            </sdk:DataGridTemplateColumn.CellTemplate>
        </sdk:DataGridTemplateColumn>
    </sdk:DataGrid.Columns>
</sdk:DataGrid>
ListePays et une List<Pays> dans mon viewModel
Pour relancer le converter au changement de pays j'ai essayé ComboBox_SelectionChanged qui fait un RaisePropertyChanged("CurrentItem") mais malgrès ca je ne rentre pas dans mon Convert . Alors qu'au Load de mes adresses je rentre bien dans mon converter et j'affiche bien les villes correspondantes aux pays déja sélectionnés