Laden...

Event in einem übergeordneten Parent registrieren

Erstellt von Phaiax vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.543 Views
P
Phaiax Themenstarter:in
56 Beiträge seit 2006
vor 17 Jahren
Event in einem übergeordneten Parent registrieren

Ich hab folgenden Code in einem UserControl, das jetzt erstmal das oberste in einer
Hirarchie darstellt

        public delegate void NewMiddle_Handler(object sender, EventArgs e);
        public event NewMiddle_Handler NewMiddle;

        public void OnNewMiddle()
        {
            NewMiddle(this, EventArgs.Empty);
        }

Dieses Element wird von einem seiner Childs aufgerufen. Alle anderen Childs sollen das Element abboniert haben, um darauf reagieren zu können
Dazu müssen sie aber erstmal an ihren Container (das Control, das ich oben als oberstes in der Hirarchie bezeichnet habe) rankommen.

Wenn ich im Konstruktor mal sowas schrebe

            DMainControl Main = this.ContainingDMainControl; // benutzt this.parent
            if (Main != null)
                Main.NewMiddle += new DMainControl.NewMiddle_Handler(ContainingDMainControl_NewMiddle);

gehts natürlich nicht, weil da das Parent noch nicht zugewiesen wurde.

Deshalb hab ich einen Eventhandler für das Event ParentChanged in den Childelementen gesetzt. Aber das Event wird nicht aufgerufen, wenn sich die Parent-eigenschaft von null auf die richtige ändert.

Gibts eine andere Möglichkeit, das Event NewMiddle in einem Child zu registrieren oder gibts vielleicht einen ganz anderen Ansatz?

Grüße, Phaiax

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Phaiax,

ein Child sollte von seinem Parent möglich nichts wissen. Wenn der Parent auf ein Event seiner Childs reagieren will, solle er selbst den EventHandler für das Child registrieren.

herbivore

P
Phaiax Themenstarter:in
56 Beiträge seit 2006
vor 17 Jahren

Du hast schon recht, ich hab vorhin schonmal einen Thread gelesen, in dem es um sowas ähnliches ging (find grad die Seite nicht)

Ich habs jetzt hinbekommen, indem ich eine Schnittstelle definiert habe.
Jedes mal, wenn dann eine Funktion in dem obersten Control (Aufruf geht über parent, da parent nur im Konstruktor nicht funktioniert) aufgerufen wird, hangelt sich das "oberste Control" rekursiv durch alle Unterelemente und sucht nach der Schnittstelle.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Phaiax,

also Schnittstelle klingt gut, klingt nach Entkoppelung und darum geht es hier ja.

Nur ist die Frage, in welche Richtung man entkoppeln muss. Ein Objekt darf (und wird) die Objekte, die es enthält, kennen und kann daher deren Methoden, Properties und Events direkt nutzen.

In die andere Richtung muss entkoppelt werden. Also ein Objekt sollte das Objekt, in dem es enthalten ist, nicht kennen (müssen). Denn sonst kann dieses innere Objekt nur in dieser Art von umgebenden Objekten benutzt werden und man will ja, dass Objekte möglich allgemein verwendbar sind. Daher stören solche Einschränkungen, die durch Kenntnis des Parents entstehen, nur. Zur Entkoppelung werden meistens Events benutzt, Schnittstellen sind eine weitere Möglichkeit.

herbivore