Bonjour,
Je code en C# depuis un moment déjà mais je me suis mis que très récemment aux databinding.

Mais je rencontre actuellement un problème pour binder une listbox à une classe métier en utilisant le mécanisme de databinding présent avec le framework 2.0.

J'ai 2 classe définies comme ceci :
La première représente les item à afficher dans la listbox :
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
    public class MyResource
    {
        private string _name;
        public string DisplayName
        {
            get
            {
                return string.Format("Nom : {0}", _name);
            }
        }
        public MyResource(string name)
        {
            _name = name;
        }
    }
La deuxième représente une classe stockant a la fois les item à afficher et les item sélectionnés :
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 class MyResourceCollection : INotifyPropertyChanged
    {
 
        private List<MyResource> _items;
        private List<MyResource> _selItems;
        public string Description { get; set; }
        public List<MyResource> Items
        {
            get
            {
                return _items;
            }
        }
        public List<MyResource> SelItems
        {
            get
            {
                return _selItems;
            }
            set
            {
                OnPropertyChanged("SelItems");
            }
        }
        public MyResourceCollection()
        {
            Description = "Ma description";
            _items = new List<MyResource>();
            _selItems = new List<MyResource>();
            PopulateItems();
        }
        public void PopulateItems()
        {
            for (int i = 0; i < 10; i++)
            {
                _items.Add(new MyResource(i.ToString()));
            }
            _selItems.Add(new MyResource("3"));
        }
        #region Event Management
        /// <summary>
        /// Event raised when a property is changed and need to be updated in the different views
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
 
        /// <summary>
        /// Event raised when a property is changed and need to be updated in the different views
        /// </summary>
        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
Pour ce qui est de l'interface graphique j'ai une une listbox, une textbox et 2 binding source.
La premiere binding source est bindé sur une instance de la classe MyRessourceCollection. La textbox est bindé sur la propriété Description de la source. Et la deuxième utilise la premiere source comme source et la propriété Items comme dataMember. La Listbox elle utilise la deuxieme source comme DataSource et utilise la propriété DisplayName comme DisplayMember.

Aux niveaux des événements le seul évènement géré est le SelectedValueChanged de la listbox dans lequel on envois une valeur bidon a la propriété SelItems de l'instance MyResourceCollection sur lequel on est bindé (qui ne modifie rien mais se contente d'envoyer une notification de changement).

Le problème est le suivant :
Lorsque l'on sélectionne un élément de la listbox, les éléments de la listbox semblent se rafraichir, et du coup c'est le premier item qui est sélectionné à la place de celui sélectionné.

D'après ce que j'en ai compris cela proviens du fait que la premiere collection fait un ListChanged de type "ItemChanged" ce qui envois un évènement ListChanged de type "Reset à la deuxième binding source".

J'ai essayé d'utiliser la propriété RaiseItemChanged=false sur les deux binding source mais cela n'a pas résolu mon problème dans le sens ou les éléments de la listbox ne sont plus du tout affiché dans ce cas là.

(je précise que dans le cas de List<string> a la place de List<MyResource> la solution du RaiseItemChanged marche parfaitement).

En résumé je fait appel a des personnes plus expérimenté que moi sur le sujet car à l'heure actuelle j'ignore totalement si il s'agit d'un bug ou d'un défaut de conception de ma part.

Merci d'avance !