Hello.
Voici ma problématique:
- un client est reliée une adresse qui elle même est reliée à une commune
- dans la fenetre d'édition j'ai un champ code postal (textbox) et un champ ville (combobox)
- le champ code postal sert à filtrer le contenu de la combobox des ville (par exemple si je tape "921" dans le code postal, la combobox contiendra unes liste avec toutes les ville dont le code postal commence par ces 3 chiffres)
- une fois la ville sélectionné, le champ code postal doit être mis à jour avec la valeur de la ville choisie
J'ai donc le problème suivant:
quand j'édite un client existant, la liste contient bien les villes avec le code postal du client mais la ville actuelle n'est PAS sélectionnée.
Ma grande question est donc: pourquoi?
Pour info, le code XAML:
Code xaml : 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
34
35
36
37
38
39
40
41 <controls:ChildWindow x:Class="ProjetX.Views.ChildViews.EditerClient" Title="Temp" DataContext="{Binding GererClientViewModel, Source={StaticResource Locator}}" Style="{StaticResource ChildWindowControlStyle}" Width="300" Height="300" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:Helpers="clr-namespace:Solixe.Helpers.UpdateSource" xmlns:dx="http://schemas.devexpress.com/winfx/2008/xaml/core" xmlns:scm="clr-namespace:System.ComponentModel;assembly=System.Windows"> <Grid x:Name="LayoutRoot" Margin="2"> <ComboBox Name="ENRCommune" ItemsSource="{Binding ListeCommunesFiltre}" SelectedItem="{Binding SelectedClient.Adresse.Commune, Mode=TwoWay}" Margin="12,28,101,210" Height="23" Width="165"> <ComboBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Comn_Nom,Mode=OneWay}" /> <TextBlock Text=" - " /> <TextBlock Text="{Binding Comn_CodePostal,Mode=OneWay}" /> </StackPanel> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> <TextBox Name="ENRCP" IsEnabled="True" Text="{Binding CodePostal, Mode=OneWay, NotifyOnValidationError=True}" Margin="12,66,101,172" Height="23" Width="165"> <i:Interaction.Behaviors> <Helpers:UpdateSourceOnTextChanged /> </i:Interaction.Behaviors> </TextBox> <Button x:Name="CancelButton" Content="Annuler" Click="CancelButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,212,0,26" /> <Button x:Name="OKButton" Content="OK" Click="OKButton_Click" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,212,83,26" /> </Grid> </controls:ChildWindow>
Le code du view model associé:
Code c# : 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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76 /// <summary> /// Fonction de modification des valeurs du Client /// </summary> /// <param name="obj"></param> public void ModifierClient(object obj) { ChargerElements(); if (SelectedClient.Adresse.Commune != null) { CodePostal = SelectedClient.Adresse.Commune.Comn_CodePostal; GenererListCommunes(CodePostal); } } /// <summary> /// Fonction de génération de la liste des communes /// </summary> private void GenererListCommunes(string cp) { // recherche liste communes if (cp.Length >= 3) { domainContext.GetCommuneByDepartement(cp, GetCommuneByDepartement_Callback, null); } } /// <summary> /// Callback après la génération de la liste des communes /// </summary> void GetCommuneByDepartement_Callback(InvokeOperation<IEnumerable<Commune>> lc) { ListeCommunesFiltre = lc.Value; if (EditerClientWindows == null) { EditerClientWindows = new Solixe.Views.ChildViews.Temp(); EditerClientWindows.HasCloseButton = false; } EditerClientWindows.Show(); } /// <summary> /// Gestion des communes/code postal /// </summary> private string codePostal; /// <summary> /// Accesseurs de gestion du code postal /// </summary> public string CodePostal { get { return codePostal; } set { if (codePostal != value) { codePostal = value; GenererListCommunes(codePostal); } } } private IEnumerable<Commune> listeCommunesFiltre; public IEnumerable<Commune> ListeCommunesFiltre { get { return listeCommunesFiltre; } set { listeCommunesFiltre = value; OnPropertyChanged("ListeCommunesFiltre"); } }
En éditant une client, la méthode ModifierClient est appelée, qui elle même appele GenererListCommunes pour créer la liste des communes et la ChildView est affichée dans le callback (afin d'être sur d'avoir la liste des communes générée à l'affichage. C'est moche mais si quelqu'un a mieux, je suis preneur).
Au final en éditant un client existant je me retrouve avec une ville non selectionnée dans la combobox mais avec une liste correcte.
![]()
Partager