Laden...

INotifyPropertyChanged Event wird nicht ausgelöst bzw. bewirkt keine GUI-Aktualisierung

Erstellt von IamTheBug vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.393 Views
I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 11 Jahren
INotifyPropertyChanged Event wird nicht ausgelöst bzw. bewirkt keine GUI-Aktualisierung

Hallo,

ich habe ein kleines Verständnissproblem mit der INotifyPropertyChanged Schnittstelle.
Ich habe eine ListBox die ich mittels Datenbindung fülle.

Hier die Klasse die eine Liste von Elementen hält.


    public class myList : INotifyPropertyChanged
    {
        #region EVENTS
        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string pAction)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(pAction));
            }
        }
        #endregion

        private List<myType> mList = new List<myType>();
        public List<myType> List
        {
            get { return this.mList; }
        }

        public void AddType(myType pType)
        {
            this.mList.Add(pType);
            NotifyPropertyChanged("Name");   <--- was muss hier als string hin?
        }

Hier die Defintion von myType:


   public class myType
    {
        private string mName;

        public myType(string pName)
        {
            this.mName = pName;
        }

        public string Name { get { return this.mName; } }
    }

Klar geht ist eine Klasse zu viel um nur einen String zu halten aber die wird noch ausgebaut und kann/macht am Ende noch mehr.

Gebunden wird jetzt wie folgt.


myList tList = new myList();
this.listBox.DataSource = tList.List;
this.listBox.DisplayMember = "Name";

Das ganze funktioniert auch initial. Also habe ich vorher ein paar myTyps in die Liste gepackt werden mir deren Namen angezeigt.
Aber wenn ich die Datenbindung einmal getätigt habe und packe neue Elemente in die Liste wird das vom Controll nicht bemerkt.
Irgendwie verwende ich das falsch.

MfG

Mfg

IamTheBug

P
992 Beiträge seit 2007
vor 11 Jahren

NotifyPropertyChanged("List"); //"public List<myType> List" hat sich geändert

5.658 Beiträge seit 2006
vor 11 Jahren

Hi IamTheBug,

 NotifyPropertyChanged("Name");   <--- was muss hier als string hin?  

Der Name der Property, die du mit dem vorhergehenden Aufruf änderst, ist "List".

Christian

Weeks of programming can save you hours of planning

I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 11 Jahren

Hm,

passiert trotzdem nix 😦
Muss ich mich an das NotifyPropertyChanged noch selber dran hängen oder passiert das automatisch? Ich dachte das ist der Vorteil und es passiert automatisch.

Ich habe an:


public event PropertyChangedEventHandler PropertyChanged

Nichts dran hängen, wenn das gefeuert wird.
Somit passiert natürlich auch nix.

Mfg

IamTheBug

F
10.010 Beiträge seit 2004
vor 11 Jahren

Du hast da einiges missverstanden.

Die Datenklasse muss INotifyPropertyChanged implementieren.
Die List muss bei DataBinding IBindingList unterstützen.

Verfrachte also INotifyPropertyChanged in die Datenklasse und benutze eine BindingList<T>.

I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 11 Jahren

aha 😄

Es sieht jetzt wie folgt aus. Ich habe von List<T> auf BindingList<T> umgestellt und jetzt bemerkt das Control schonmal ein Hinzufügen eines neuen Elementes.
INotifyPropertyChanged habe ich erstmal komplett weggelassen.
Die Schnittstelle wird wohl nur verwendet, wenn sich ein Eigenschaftswert innerhalb der Datenklasse verändert und diese Aktualisierung mitgeteilt werden soll?
Das heißt mit dem "es ist ein Element zur Liste hinzugekommen" hat das erstmal gar nichts zu tun oder?

Mfg

IamTheBug

F
10.010 Beiträge seit 2004
vor 11 Jahren

Stünde alles in der Doku, schon mal versucht?

I
IamTheBug Themenstarter:in
401 Beiträge seit 2006
vor 11 Jahren

Jo klar lese ich immer vorher, bevor ich hier jemanden belästige. Manchmal versteht man es eben falsch oder ich habe einfach das Beispiel falch umgemünzt auf mein Problem 😄

Danke vielmals. Dann kann ich dazu mal weiter experimentieren und lesen.
Das mit dem Eigenschaften ändern funktioniert auch 😃

Mfg

IamTheBug