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

Windows Presentation Foundation Discussion :

PropertyChanged dans ObservableCollection


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Par défaut PropertyChanged dans ObservableCollection
    Bonjour,

    Je suis face à un problème que je n'arrive pas à résoudre, peut être quelqu'un pourrait-il m'aider :

    J'ai une class Main avec une ObservableCollection.
    Je "Listen" les changements sur cette Collection "CollCfe_CollectionChanged"
    Je "Listen" également les propriété des objets de cette collection.

    Ce que je voudrais c'est : "Listen" les changements dans un objet de ma collection d'objet

    COLL[]
    OBJET
    STRING==> comment faire pour savoir que cette variable à été modifiée depuis la classe ou se trouve ma collection ?
    En code :

    CLASS main contenant
    la collection COLL[]

    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
    class Main
    {
    	ObservableCollection<ConfigElem> collCfe = new ObservableCollection<ConfigElem>();
    	public ObservableCollection<ConfigElem> CollCfe
    	{
    		get { return collCfe; }
    		set { collCfe = value; RaisePropertyChanged("CollCfe"); }
    	}
     
    	public Main()
    	{
    		collCfe.CollectionChanged += CollCfe_CollectionChanged;
    	}
    	void CollCfe_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    	{
    		// Add
    		if (e.NewItems != null) ((ConfigElem)e.NewItems[0]).PropertyChanged += onPropertyChanged;
    		// Remove
    		if (e.OldItems != null) ((ConfigElem)e.OldItems[0]).PropertyChanged -= onPropertyChanged;
    	}
    	void onPropertyChanged(object sender, PropertyChangedEventArgs e)
    	{
     
    		"J AIMERAI INTERCEPTER LES CHANGEMENT DE UneChaine ICI
    		..."
    	}
    }
    CLASS contenant mon OBJECT

    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
    class ConfigElem
    {
    	SubClass myObject;
    	public SubClass MyObject
    	{
    		get { return myObject; }
    		set { myObject = value; RaisePropertyChanged("MyObject"); }
    	}
     
    	************* NE FONCTIONNE PAS A CAUSE DE ((ConfigElem)e.NewItems[0]).PropertyChanged += onPropertyChanged; QUI SEMBLE MASQUER ********************
    	public ConfigElem()
    	{
    		MyObject.PropertyChanged += onPropertyChanged;
    	}
    	void onPropertyChanged(object sender, PropertyChangedEventArgs e)
    	{
     
    		"OU ....  LES INTERCEPTER ICI
    		..."
    	}
    	*********************************************************************************************************************************
    }
    CLASS concernant ma STRING que je veux savoir si elle à été updatée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class SubClass
    {
    	String uneChaine;
    	public String UneChaine
    	{
    		get { return uneChaine; }
    		set { uneChaine = value; RaisePropertyChanged("UneChaine"); }
    	}
    }

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur C#
    Inscrit en
    Avril 2011
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur C#
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 348
    Par défaut
    SOLUTION :

    Je ne l'ai pas mis dans l'exemple car je ne pensais pas que le problème venait de la. Dans ce bout de code, je realloue "myObject"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	void CollCfe_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
    	{
    		// Add
    		if (e.NewItems != null) 
    		{
    			((ConfigElem)e.NewItems[0]).PropertyChanged += onPropertyChanged;
    			cfElem.MyObject= new RemiseProduit(c.MyObject);
    		}
    
    		// Remove
    		if (e.OldItems != null) ((ConfigElem)e.OldItems[0]).PropertyChanged -= onPropertyChanged;
    	}
    , je n'ai pas penser à remettre dans mon setter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	SubClass myObject;
    	public SubClass MyObject
    	{
    		get { return myObject; }
    		set 
    		{ 
    			myObject = value; 
    			MyObject.PropertyChanged += onPropertyChanged;
    			RaisePropertyChanged("MyObject"); 
    		}
    	}
    En espérant que ca puisse aider :-)

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur VB6 et tout neuf en .Net
    Inscrit en
    Avril 2005
    Messages
    377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur VB6 et tout neuf en .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2005
    Messages : 377
    Par défaut
    Bonjour draco951,

    Voici une ObservableCollection qui publie un événement quand une propriété d'un item change.
    La seule contrainte est que les Items contenus dans cette collection doivent implémenter l'interface INotifyPropertyChanged.

    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
    56
    57
    58
    59
    60
     
        public class MyObservableCollection<T> : ObservableCollection<T>
            where T : INotifyPropertyChanged
        {
     
            public delegate void ItemPropertyChangedHandler(object Sender, MyObservableCollectionPropertyChangedEventArgs e);
            public event ItemPropertyChangedHandler PropertyChanged;
     
            public MyObservableCollection()
                : base()
            {
                base.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(MyObservableCOllection_CollectionChanged);
            }
     
            void MyObservableCOllection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
            {
                if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
                {
                    foreach (T item in e.OldItems)
                    {
                        //Removed items
                        item.PropertyChanged -= new PropertyChangedEventHandler(item_PropertyChanged);
                    }
                }
                else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
                {
                    foreach (T item in e.NewItems)
                    {
                        //Added items
                        item.PropertyChanged += new PropertyChangedEventHandler(item_PropertyChanged);
                    }
                }
            }
     
            void item_PropertyChanged(object sender, PropertyChangedEventArgs e)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new MyObservableCollectionPropertyChangedEventArgs(sender, e));
                }
            }
        }
     
        //Arguments de l'évébement PropertyChanged de la classe MyObservableCollection
        public class MyObservableCollectionPropertyChangedEventArgs : PropertyChangedEventArgs
        {
            public Object Item { get; set; }
     
            public MyObservableCollectionPropertyChangedEventArgs(Object Item, string propertyName)
                : base(propertyName)
            {
                this.Item = Item;
            }
     
            public MyObservableCollectionPropertyChangedEventArgs(Object Item, PropertyChangedEventArgs e)
                : base(e.PropertyName)
            {
                this.Item = Item;
            }
        }

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

Discussions similaires

  1. observableCollection de bouton dans un Datagrid ou LIstView
    Par mickeybond dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 13/02/2012, 15h16
  2. trouver si une valeur est contenue dans ObservableCollection
    Par Golzinne dans le forum Silverlight
    Réponses: 3
    Dernier message: 25/01/2012, 10h08
  3. PropertyChange sur un textbox se trouvant dans un item de treeview
    Par gueulederack dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 19/05/2011, 16h00
  4. [MVVM] Recherche dans une ObservableCollection
    Par DotNET74 dans le forum Windows Phone
    Réponses: 11
    Dernier message: 11/04/2011, 13h08
  5. INotifyPropertyChanged,ObservableCollection, marche pas dans le code ?
    Par Miguelito Loveless dans le forum Windows Presentation Foundation
    Réponses: 14
    Dernier message: 13/01/2011, 22h05

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