views:

1451

answers:

7

I have multiple layers in an application and i find myself having to bubble up events to the GUI layer for doing status bar changes, etc . . I find myself having to write repeated coded where each layer simply subscribes to events from the lower layer and then in the call back simply raise an event up the chain. Is there a more efficient way of doing this?

A: 

You can have a central channel that only support events. This channel must be independent so the layer only publish or subscribe to it.

Hapkido
This sounds interesting, but the explanation is very vague. Can you give some examples?
spoulson
+10  A: 

If all you're doing is firing an event handler from another event handler, you can cut out the middle man and hook the event handlers directly in the add/remove blocks for the event.

For example, if you have a UserControl with a "SaveButtonClick" event, and all you want to do when is call the event handler when the "SaveButton" on your UserControl is clicked, you can do this:

public event EventHandler SaveButtonClick
{
    add { this.SaveButton.Click += value; }
    remove { this.SaveButton.Click -= value; }
}

Now you don't need any code to fire the SaveButtonClick event - it will automatically be fired when the SaveButton.Click event is raised (ie when someone clicks that button).

Matt Hamilton
That sounds interesting. Would love to see the implementation.
Maxim
@Maxim - the code I've posted there *is* the implementation. If you have a UserControl with a button called SaveButton and you drop that UC onto a form, you can subscribe to SaveButtonClick from the form, and whenever the button is clicked your event handler will be called.
Matt Hamilton
i like the idea and easy implementation. but I don't like the dependency that you create between the usercontrol and the subscriber
Peter Gfader
the button is part of the subscriber though, aka, the button won't exist without the user control so the dependancy is fine.
Sekhat
+2  A: 

Unless I see a bit more of the design.. it'll be hard to give a good answer.

WPF does bubble events up (automatically) the UI Component/Control tree... this has now been built into the framework. So I guess that's the recommended way :)

The trouble with bypassing the middle man Layer2 is that Layer1 and Layer3 now know each other... are coupled. So its a tradeoff.. if you are okay with the coupling.. eliminate the middle man / invent a specialized component with this responsibility. However if you expect Layer 3 to be hot-swappable (low coupling), I'd say continue bubbling.

Gishu
A: 

Take a look at Update Controls .NET. These controls discover the parts of your data model that they depend upon even through layers of business logic. You don't have to write any code to notify them.

Michael L Perry
+3  A: 

Have a read of Jeremy Miller's blog "The Shade Tree Developer", especially his Write Your Own CAB series - the command pattern stuff he talks about there is probably what you need.

Bevan
A: 

Peter Rilling has posted a way of simulating Event Bubbling/Broadcasting in winforms. It is simple and effective.

http://www.codeproject.com/KB/cs/event_broadcast.aspx

Ben
A: 

Here is a useful link which discusses bubbling up events from user controls. http://cherupally.blogspot.com/2010/02/bubbling-up-events-from-user-control-to.html

Kiran Cherupally