Hallo,
kann mir vielleicht jemand sagen warum im folgendem Code das Event nicht gefeuert wird?
public delegate void MyValueChangeEventHandler(object sender, MyEventArgs e);
public class MyEventArgs : EventArgs
{
public List<string> oldvalue = new List<string>();
public List<string> newvalue = new List<string>();
public MyEventArgs(List<string> _oldvalue, List<string> _newvalue)
{
newvalue = _newvalue;
oldvalue = _oldvalue;
}
}
class MyPlaylist_x
{
public event MyValueChangeEventHandler myChanging;
protected List<string> myValue = new List<string>();
public List<string> MyValue
{
get { return myValue;}
set { if (myChanging != null)
{
myChanging(this, new MyEventArgs(myValue, value));}
}
}
}
//aufrufen
private static void test(object sender, MyEventArgs e)
{
MessageBox.Show("Hallo");
}
public void AddPlayListEntry(string[] entry)
{
//PlayListEntries.AddRange(entry);
this.myPl.myChanging += new MyValueChangeEventHandler(test);
myPl.MyValue.AddRange(entry);
}
Das Problem ist jetzt, dass das Event nie ausgeführt wird, wenn ich über die Funktion AddPlayListEntry einen neuen eintrag hinzufüge.
Gruß
Hallo housefreak,
weil du MyValue nicht änderst. Mit myPl.MyValue.AddRange(entry) wird nur der Getter von MyValue aufgerufen.
herbivore
Und was muss ich daran ändern?
Wenn ich mir das im debugger ansehe wird doch der Wert für MyValue verändert?
Gruß
Hallo housefreak,
es wir der Inhalt des Objekts in MyValue verändert. Der Event schlägt aber nur zu, wenn ein (neues) Objekt am MyValue zugewisen wird. Das sind zwei paar Schuhe.
Ich sehe da keine andere Lösungsmöglichkeit, als eine eigene Collection zu implementieren, die ein Event wirft, wenn ihr Inhalt verändert wird.
herbivore
@herbivore
ist das viel aufwand, oder geht das und wenn ja wie implementiere ich sowas?
gruß
Hallo housefreak,
soviel ist das nicht. Spezielle Collections gibt es im Framework wie Sand am Meer (z.B. ControlCollection). Wie die Implementiert sind, kannst du dir ja mit dem Reflector angucken. Normalerweise haben die intern eine ArrayList, weil sie meist noch aus 1.0 stammen, aber du kannst stattdessen besser eine List<string> nehmen.
herbivore
Hi housefreak!
Noch einfach wäre, wenn du
myPl.MyValue.AddRange(entry);
in einer öffentlichen Methode von MyPlaylist_x kapselst. So kannst du oben stehenden Zugriff in der Methode ausführen und mit dieser dann auch das Event feuern.
der Marcel
EDIT: letztenendes läuft ja herbivores Vorschlag fast auf das selbe hinaus. Nur eben eine extra Klasse mit Vererbung fällt dabei raus.
:] 😄Der größte Fehler eines modernen Computers sitzt meist davor 😁 :]
Hallo der Marcel,
ob man die Collection-Zugriffe in einer Collection oder in der die Collection zur Verfügung stellen den Klasse kapselt, ist Geschmachssache. Einfacher ist das eine oder andere m.E. nicht.
herbivore