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


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    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
    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
    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
    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
    Expert confirmé
    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<img src="images/smilies/icon_mad.gif" border="0" alt="" title=":x" class="inlineimg" />="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
    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

###raw>template_hook.ano_emploi###