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

Windows Presentation Foundation Discussion :

Problème de binding suite à une MAJ d'une ObservableCollection [Débutant]


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    février 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 72
    Points : 95
    Points
    95
    Par défaut Problème de binding suite à une MAJ d'une ObservableCollection
    Bonjour,
    J'ai un problème de binding de ma ComboBox suite à une MAJ de ma collection

    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
        public partial class MainWindow : Window
        {
            public class Capitale
            {
                public int Id { get; set; }
                public string Nom { get; set; }
            }
            public ObservableCollection<Capitale> Capitales { get; private set; } = new ObservableCollection<Capitale>();
            public MainWindow()
            {
                InitializeComponent();
                DataContext = this;
     
                Capitales.Add(new Capitale { Id = 1, Nom = "Paris" });
                Capitales.Add(new Capitale { Id = 2, Nom = "Bruxelles" });
                Capitales.Add(new Capitale { Id = 3, Nom = "Londres" });
            }
     
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                // Mettre les noms de ville en Anglais
                for (int i = 0; i < Capitales.Count; i++)
                {
                    if (Capitales[i].Id == 1) Capitales[i].Nom = "Paris";
                    if (Capitales[i].Id == 2) Capitales[i].Nom = "Brussels";
                    if (Capitales[i].Id == 3) Capitales[i].Nom = "London";
                }
            }
        }
    Code XAML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        <StackPanel Orientation="Horizontal">
            <ComboBox ItemsSource="{Binding Capitales}" IsSynchronizedWithCurrentItem="True" DisplayMemberPath="Nom" SelectedValue="{Binding SelectedVille}" SelectedValuePath="Id" Width="150" Height="20"/>
            <Button Width="100" Height="20" Content="MAJ " Click="Button_Click_1" Margin="10,0,0,0"/>
        </StackPanel>

    Quand je clique sur le bouton, la MAJ ne se fait pas.
    Merci pour votre aide

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    avril 2007
    Messages
    13 657
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : avril 2007
    Messages : 13 657
    Points : 24 700
    Points
    24 700
    Par défaut
    il faut que la propriété avertisse pour que le changement de sa valeur soit reflétée sur l'UI
    soit en implémentant INotifyPropertyChanged soit en faisant des Dependency Property

    ObservableCollection averti seulement lors de modification du type .Add / .Remove, ca ne regarde pas si les éléments contenus changent
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    février 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 72
    Points : 95
    Points
    95
    Par défaut
    Bonjour Pol63,
    Tout d'abord merci pour ton aide.
    Ca ne se voit pas sur mon exemple mais avant d'exposer mon problème j'avais bien implémenté INotifyPropertyChanged et le même problème pas de mise à jour. Je vais réessayer !!!

    Par contre si je mets ce code dans le click du bouton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                Capitales.Clear();
                Capitales.Add(new Capitale { Id = 1, Nom = "Paris" });
                Capitales.Add(new Capitale { Id = 2, Nom = "Brussels" });
                Capitales.Add(new Capitale { Id = 3, Nom = "London" });
            }
    la mise à jour fonctionne très bien et sans INotifyPropertyChanged c'est pour cela que je l'ai supprimer, mais mon problème je veux faire une mise à jour de mon ObservableCollection sans le clear();

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    février 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 72
    Points : 95
    Points
    95
    Par défaut
    J'ai implémenté INotifyPropertyChanged mais toujours pas de mise à jour

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
       public partial class MainWindow : Window, INotifyPropertyChanged
        {
            public class Capitale
            {
                public int Id { get; set; }
                public string Nom { get; set; }
            }
     
            private ObservableCollection<Capitale> _capitales;
            public ObservableCollection<Capitale> Capitales
            {
                get { return _capitales; }
                set
                {
                    _capitales = value;
                    RaisePropertyChangedEvent("Capitales"); 
                }
            }
     
            public event PropertyChangedEventHandler PropertyChanged;
            protected void RaisePropertyChangedEvent(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChangedEventArgs e = new PropertyChangedEventArgs(propertyName);
                    PropertyChanged(this, e);
                }
            }
     
     
            //public ObservableCollection<Capitale> Capitales { get; private set; } = new ObservableCollection<Capitale>();
            public MainWindow()
            {
                InitializeComponent();
                DataContext = this;
     
                Capitales = new ObservableCollection<Capitale>();
                Capitales.Add(new Capitale { Id = 1, Nom = "Paris" });
                Capitales.Add(new Capitale { Id = 2, Nom = "Bruxelles" });
                Capitales.Add(new Capitale { Id = 3, Nom = "Londres" });
            }
     
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                //// Mettre les noms de ville en Anglais
                for (int i = 0; i < Capitales.Count; i++)
                {
                    if (Capitales[i].Id == 1) Capitales[i].Nom = "Paris";
                    if (Capitales[i].Id == 2) Capitales[i].Nom = "Brussels";
                    if (Capitales[i].Id == 3) Capitales[i].Nom = "London";
                }
            }
        }
    }
    Pas facile

  5. #5
    Membre expert
    Inscrit en
    avril 2008
    Messages
    2 251
    Détails du profil
    Informations personnelles :
    Âge : 59

    Informations forums :
    Inscription : avril 2008
    Messages : 2 251
    Points : 3 786
    Points
    3 786
    Par défaut
    bonjour

    Pol63 a raison dans tous les cas.
    Le code communiqué par "tes soins" comporte comme toujours soit un raté("flaw"),soit une omission de taille que les membres du forum ne sont pas censés deviner(le métier de devin n’étant pas très lucratif).
    D’ où vient le "SelectedVille" du code xaml,que veut-il dire ?

    Le code suivant fonctionne parfaitement comme un charme :
    1/code du class data:
    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
    34
    35
    using System;
    using System.ComponentModel;
    namespace WpfAppCombo
    {
        public class Capitale:INotifyPropertyChanged
        {
            private int id;
            public int Id 
            {
                get { return id; }
                set 
                { 
                    id=value ;
                    Notify("Id");
                } 
            }
            private string nom;
            public string Nom
            {
                get { return nom; }
                set 
                {
                    nom = value;
                    Notify("Nom");
                } 
            }
            public event PropertyChangedEventHandler PropertyChanged;
            private void Notify(string propName)
            {
                PropertyChangedEventHandler h = PropertyChanged;
                if (h != null)
                    h(this, new PropertyChangedEventArgs(propName));
            }
        }
    }
    2/code xaml du form user:
    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
    <Window x:Class="WpfAppCombo.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel Orientation="Horizontal">
            <ComboBox ItemsSource="{Binding Capitales}" 
                      IsSynchronizedWithCurrentItem="True" 
                      DisplayMemberPath="Nom" 
                      SelectedValue="{Binding Id}"
                      SelectedValuePath="Id" 
                      Width="150" Height="20"/>
            <Button Width="100" Height="20" Content="MAJ " Click="Button_Click_1" Margin="10,0,0,0"/>
        </StackPanel>
    </Window>
    bon code.

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    février 2006
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : février 2006
    Messages : 72
    Points : 95
    Points
    95
    Par défaut
    Ca fait plaisir d'avoir du code charmant

    Un très grand merci à vous deux pour votre aide

    A bientôt pour de nouvelles aventures codées

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/05/2013, 18h47
  2. [WPF] Problème de binding avec une classe perso
    Par JuTs dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 12/04/2010, 19h45
  3. problème de binding d'une UISelectOne
    Par al3alwa dans le forum JSF
    Réponses: 2
    Dernier message: 27/06/2008, 12h46
  4. [WPF] Problème de binding entre une SortedList et une ListBox
    Par JuTs dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 10/12/2007, 14h20
  5. Problème de son suite à une mise a niveau
    Par Lafab dans le forum Windows Vista
    Réponses: 1
    Dernier message: 05/09/2007, 21h42

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