IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Silverlight Discussion :

binding avec combobox ne marchant pas


Sujet :

Silverlight

  1. #1
    Invité
    Invité(e)
    Par défaut binding avec combobox ne marchant pas
    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.

    Dernière modification par Deepin ; 29/12/2011 à 08h53. Motif: Coloration syntaxique

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 080
    Points
    8 080
    Par défaut
    Comment est définie la classe Commune ?

  3. #3
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Y'a bien un Notifypropertychanged quand tu assigne selectedclient?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    Comment est définie la classe Commune ?
    C'est simplement une classe générée avec EntityFramework.
    Pour infos, les metadatas:
    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
    [MetadataTypeAttribute(typeof(Commune.CommuneMetadata))]
    public partial class Commune
    {
        internal sealed class CommuneMetadata
        {
            public EntityCollection<Adresse> Adresses { get; set; }
     
            public string Comn_CodePostal { get; set; }
     
            public int Comn_fk_Pays { get; set; }
     
            public string Comn_Nom { get; set; }
     
            public int Comn_pk { get; set; }
     
            public Pays Pays { get; set; }
        }
    }

    Citation Envoyé par GuruuMeditation Voir le message
    Y'a bien un Notifypropertychanged quand tu assigne selectedclient?
    oui, j'ai bien l'accesseur qui est du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            public PartenaireENR SelectedPartenaireENR
            {
                get { return selectedPartenaireENR; }
                set
                {
                    if (value != null)
                    {
                        selectedPartenaireENR = value;
                        OnPropertyChanged(() => SelectedPartenaireENR);
                    }
                }
            }

Discussions similaires

  1. Binding avec ComboBox
    Par myCollections dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 04/11/2010, 17h58
  2. Combobox constant binding avec un champ de db
    Par loulouklm dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 12/05/2009, 18h18
  3. [WPF] ComboBox, binding avec association LINQ
    Par tomlev dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 30/04/2008, 00h30
  4. Fonction ne marchant pas avec FomShow
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 3
    Dernier message: 02/10/2006, 14h59
  5. Feuille de style avec Hover ne marchant pas avec IE
    Par ouioui2000 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 06/03/2006, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo