Forcer un converter sur un champs dans une Grid sur la modification d'un autre champs
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:
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:
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:
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:
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:
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